2013-04-30 13 views
12

Mam DataTable, który wygląda jak poniżej;Jak sortować DataTable przez dwie kolumny w C#

|    ID     | ItemIndex | ItemValue 
ce895bd9-9a92-44bd-8d79-986f991154a9  1   3 
ae7d714e-a457-41a8-8bb4-b5a0471c3d2f  2   2 
a774dff3-acc0-4f50-a211-a775e28dcae3  2   1 
292bbd50-290b-4511-9e4e-2e74e3ebe273  3   2 
ae7d714e-a457-41a8-8bb3-b5a0471c3d22  3   1 

Chcę uporządkować tę tabelę ItemIndex pierwszy, a następnie posortować tabelę posortowanych według ItemValue.

Jak mogę to osiągnąć?

Edycja: po sortowaniu chcę mieć mój stół jak poniżej;

|    ID     | ItemIndex | ItemValue 
ce895bd9-9a92-44bd-8d79-986f991154a9  1   3 
a774dff3-acc0-4f50-a211-a775e28dcae3  2   1 
ae7d714e-a457-41a8-8bb4-b5a0471c3d2f  2   2 
ae7d714e-a457-41a8-8bb3-b5a0471c3d22  3   1 
292bbd50-290b-4511-9e4e-2e74e3ebe273  3   2 
+0

Jak mogę tabela grupy i uporządkować każdy element osobno? –

+0

'DataView dv = new DataView (dt);' 'dv.Sort =" ItemIndex, ItemValue "'; ' –

Odpowiedz

23

Można użyć LINQ to DataSet/DataTable

var newDataTable = yourtable.AsEnumerable() 
        .OrderBy(r=> r.Field<int>("ItemIndex")) 
        .ThenBy(r=> r.Field<int>("ItemValue")) 
        .CopyToDataTable(); 
+0

Czy mamy teraz dwa obiekty DataTable? – DOK

+0

@DOK, tak, ale wynik może zostać przypisany z powrotem do oryginalnej DataTable. – Habib

+1

dziękuję, działa świetnie :) –

19

Tworzenie DataView i użyć sortowania właściwość:

DataView dv = new DataView(dt); 
dv.Sort = "ItemIndex, ItemValue"; 

np

foreach (DataRowView row in dv) { 
    Console.WriteLine(" {0} \t {1}", row["ItemIndex"], row["ItemValue"]); 
} 

Aby uzyskać więcej informacji, sprawdź MDSN dla dokładniejszej przykład:

http://msdn.microsoft.com/en-us/library/system.data.dataview.sort.aspx

+0

Krótkie i słodkie, nie tworzy kolejnego (potencjalnie dużego) obiektu, a ten kod jest wysoce czytelny, jeśli nieco mniej seksowny niż przy użyciu Linq. – DOK

+0

dziękuję, działa również świetnie. Ale nie rozumiem, czy dt jest sortowany po dv.Sort. –

+0

@George - Cześć, działa dla kolumn ciągów, ale mam kolumnę powiedzieć ColA. z wartościami łańcuchów 1,23, 11,45 i 2,34, ponieważ są to wartości łańcuchowe, których sposób sortowania nie będzie miał na nie wpływu. Utknąłem tutaj, co powinienem zrobić? –

8

Tworząc DataView

var dataView = new DataView(dataTable); 
dataView.Sort = "ItemIndex ASC, ItemValue ASC" 

Tutaj dataTable jest stół chcesz sortować

+0

Napisałbym to samo! Odsyłacz do MSDN: https://msdn.microsoft.com/en-us/library/system.data.dataview.sort(v=vs.110).aspx – vapcguy

16

W obiekcie danych można uzyskać domyślny widok obje ct i ustawić sortowanie.

dataTable.DefaultView.Sort = "ItemIndex, ItemValue"; 
+0

To jest najprostsza odpowiedź do tej pory i działa idealnie, dziękuję . – Taegost

+0

idealnie, czego potrzebuję. –

+1

W celu wyjaśnienia: Nadal trzeba wywołać metodę dataTable.DefaultView.ToTable() w celu faktycznego wykonania sortowania i skopiowania (posortowanych) wierszy do nowej tabeli DataTable lub można wykonać iterację tabeli dataTable.DefaultView.Ale nie można po prostu zastosować właściwości .Sort, a następnie iterować wiersze oryginalnej tabeli danych i oczekiwać, że będą one posortowane w kolejności. –

0

Alternatywnie można użyć że

DataView oDataSet; 
oDataSet.Tables[0].DefaultView.Sort = "Column1 ASC "; 
0
_UserAuditTrailTable.DefaultView.Sort = sortExpression;