Hej hej! Den fungerar nog :) Eller så gör du det via linq, något i stil med (sannolikt väldigt inkorrekt kod, men jag tror du hajar principen): 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 :) ) Fungerade utmärkt :) Tack för svaren! 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. Om du använder dot.net 3.5... Han kör ju inte LINQ..! :)Loopa genom raderna i en datatable i en viss ordning.
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.Sv: Loopa genom raderna i en datatable i en viss ordning.
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.Sv:Loopa genom raderna i en datatable i en viss ordning.
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).Sv:Loopa genom raderna i en datatable i en viss ordning.
Sv: Loopa genom raderna i en datatable i en viss ordning.
Sv:Loopa genom raderna i en datatable i en viss ordning.
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?Sv: Loopa genom raderna i en datatable i en viss ordning.
Använd då linq orderby operator och skriv din egen comparer..
se http://www.java2s.com/Code/CSharp/LINQ/OrderBywithcustomizedComparer.htmSv:Loopa genom raderna i en datatable i en viss ordning.
Select("1=1", "Date, Time"); //stigande sort
Select("1=1", "Date DESC, Time DESC"); //fallande sort