Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Loopa genom raderna i en datatable i en viss ordning.

Postades av 2009-07-09 20:37:21 - Jonas Sjöblom, i forum c# (c-sharp), Tråden har 7 Kommentarer och lästs av 1385 personer

Hej hej!
Jag har en DataTable som fylls från en xmlfil med ReadXml();

I den här tabellen finns 2 fält:
Time och Message

Det jag försöker göra är att ta bort alla rader utom en där message har samma värde. Jag vill lämna kvar den nyaste (den nyaste ska lämnas kvar).

Exempel:
<code>
Time Message
*2009.06.07 10:30 Hejsan
2009.06.07 11:30 Jag håller med
2009.06.07 12:30 Hejsan
*2009.06.07 13:30 Nej tack
2009.06.07 14:30 Nej tack
</code>

De som jag markrade med * ovan ska tas bort.

Jag kunde inte hitta någon inbygd funktion för detta så jag försökte skapa min egen


MessagesTable är tabellen med meddelanden
<code>
/* Remove duplicate rows */
// Messages that has been looped through
List<string> previousMessages = new List<string>();

// Messages that will be removed.
List<DataRow> messagesToRemove = new List<DataRow>();

// Sort descending to get a correct order when removing items
MessagesTable.DefaultView.Sort = "Time desc"; // <-- Om den här raden hade fungerat skulle det fungera, men den har ingen effekt.

// Loop through messages and look for duplicates.
foreach(DataRow row in MessagesTable.Rows)
{
// Remove duplicates.
if (previousMessages.Contains(row["Message"].ToString()))
{
// Add it to remove-list.
messagesToRemove.Add(row);
}

// Add message to previous messages.
previousMessages.Add(row["Message"].ToString());
}

// Remove messages.
foreach (DataRow row in messagesToRemove)
MessagesTable.Rows.Remove(row);
</code>


Som ni ser är det raden:
<code>MessagesTable.DefaultView.Sort = "Time desc";</code>
som inte vill fungera.

Finns det ågon färdig lösning på mitt problem tar jag självklart gärna emot förslag. Annars skulle jag behöva en lösning på sorteringen.


Svara

Sv: Loopa genom raderna i en datatable i en viss ordning.

Postades av 2009-07-10 15:30:13 - Ola Lindfeldt

Den fungerar nog :)
Men du accessar inte DefaultView sedan, utan Rows och de blir inte automatiskt omsorterade för att du sorterar DefaultView. Det är ett eget objekt. Tänk SQL-View vs Tabell.

Fritt efter minnet tror jag att ditt bästa val är att göra en DT.Select("1=1", "Time desc") alltså med sortering, denna returnerar då en sorterad Array med referenser till DataRows som du kan behandla sekventiellt i rätt ordning.


Svara

Sv:Loopa genom raderna i en datatable i en viss ordning.

Postades av 2009-07-10 17:29:57 - Niklas Jansson

Eller så gör du det via linq, något i stil med (sannolikt väldigt inkorrekt kod, men jag tror du hajar principen):

var msgs = from msg in messages.rows group by msg.["Message"] select new {m =msg.["Message"] , t= max("Time")};

var msgswithrest = (from msg in messages.rows where msgs contains( new {msg.["Message"], t= max("Time")};

Alltså, hämta först ut message med bara tid och innehåll, hämta sen ut hela (om det finns fler fält än tid och message).


Svara

Sv:Loopa genom raderna i en datatable i en viss ordning.

Postades av 2009-07-11 00:32:41 - Jonas Sjöblom

Tackar för svaren, jag är inte bekant med Linq, så jag testar med Olas förslag imorgon (På tok för sent just nu :) )


Svara

Sv: Loopa genom raderna i en datatable i en viss ordning.

Postades av 2009-07-11 11:42:45 - Jonas Sjöblom

Fungerade utmärkt :) Tack för svaren!


Svara

Sv:Loopa genom raderna i en datatable i en viss ordning.

Postades av 2009-07-13 23:07:00 - Jonas Sjöblom

Hej igen, nu har jag stött på ett nyt problem, men jag ids inte starta en helt ny tråd så postar här igen.

Mitt scenario är detsamma, jag vill sortera en tabell. Men den här gången är det en tabell som mergats från andra tabeller:
(jag har en tabell per dag, varje tabell har flera tider+datum lagrade)
<code>
for (int i = files.Count - 1; i >= files.Count - numberOfDays; i--)
{
if (i >= 0 && i < files.Count)
{
DataSet mess = new TimeTracker.Messages();
mess.ReadXml(files[i]);
MessagesTable.Merge(mess.Tables[0]); // <---
}
}
</code>

Efter det gör jag exakt som tidigare:

<code>
DataTable sorted = MessagesTable.Select("1=1", "Time desc");
</code>

Det som händer är att de sorteras rätt efter tid men fel efter datum (kolumnen Time är datatyp DateTime)

Blir alltså

2009.07.23 10:00
2009.07.23 11:00
2009.07.22 05:00
2009.07.22 08:00

istället för
2009.07.22 05:00
2009.07.22 08:00
2009.07.23 10:00
2009.07.23 11:00



Verkligt mysko, gör inte merge som namnet säger och smälter samman 2 tabeller? Är dom fortfarande skilda på något sätt efter en merge?


Svara

Sv: Loopa genom raderna i en datatable i en viss ordning.

Postades av 2009-07-15 12:30:12 - Benny Testar

Om du använder dot.net 3.5...

Använd då linq orderby operator och skriv din egen comparer..

se http://www.java2s.com/Code/CSharp/LINQ/OrderBywithcustomizedComparer.htm


Svara

Sv:Loopa genom raderna i en datatable i en viss ordning.

Postades av 2009-08-14 09:48:26 - Ola Lindfeldt

Han kör ju inte LINQ..! :)

Select("1=1", "Date, Time"); //stigande sort
Select("1=1", "Date DESC, Time DESC"); //fallande sort


Svara

Nyligen

  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak
  • 16:14 Vem anlitar man egentligen när tak
  • 16:13 Vem anlitar man egentligen när tak
  • 11:52 Noen erfaring med uttak hos Mostbe
  • 11:51 Noen erfaring med uttak hos Mostbe

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 635
27 958
271 741
500
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies