2010-06-23 220 views
2

好的,我有一個列表,我想排序。首先,一些代碼:如何對列表進行排序?

foreach (var Row in Result) 
    { 
     foreach (var RowAll in Row.All) 
     { 
      DataObject.Add(new List<string>() { RowAll.Value1, RowAll.Value2, RowAll.Value3}); 
      break; 
     } 
    } 

現在我想根據每個子列表的Value2對父列表進行排序。 這可能嗎?如果是這樣,我該怎麼做?

回答

9

您可以通過LINQ做到這一點:

// I'm assuming here that "LastCheckin" is defined as List<List<string>> or similar 
// ... 

var sorted = Data.LastCheckin.OrderBy(list => list[1]); 

這將返回一個IEnumerable<List<string>>含在子列表(值2)第二個值整理你的「名單」。


如果要排序的位置列表中,您可以使用List<T>.Sort代替:

Data.LastCheckin.Sort((a,b) => a[1].CompareTo(b[1])); 

如果需要指定,在運行時,上升或decending,一個簡單的方法來處理,這是:

bool ascending = true; // Set to false for decending 

int mult = ascending ? 1 : -1; 
Data.LastCheckin.Sort((a,b) => mult * a[1].CompareTo(b[1])); 

爲了處理更復雜的檢查,你可以分割你的拉姆達萬畝以上多行:

bool ascending = true; // Set to false for decending 
string myDateFormat = GetDateFormat(); // Specify date format 

int mult = ascending ? 1 : -1; 
Data.LastCheckin.Sort((aStr,bStr) => 
    { 
     DateTime a, b; 
     bool aSuccess = DateTime.TryParseExact(aStr[1], myDateFormat, DateTimeStyles.None, CultureInfo.InvariantCulture, out a); 
     bool bSuccess = DateTime.TryParseExact(bStr[1], myDateFormat, DateTimeStyles.None, CultureInfo.InvariantCulture, out b); 

     int result; 
     if (!aSuccess) 
      result = bSuccess ? -1 : 0; 
     else if (!bSuccess) 
      result = 1; 
     else 
      result = a.CompareTo(b); 

     return mult * result; 

    }); 

這會處理a和b上的解析器故障,並應將它們放在排序的末尾。

+0

我怎麼可能保持Data.LastCheckin的數據,而不將其放入排序?或者,如何訪問已排序的內容並將其放回到Data.LastCheckin中? – sooprise 2010-06-23 17:40:16

+0

@Soo:我只是添加了一個就地排序,通過列表 .Sort。它應該做你以後的事情。 – 2010-06-23 17:41:07

+0

如何指定升序或降序? – sooprise 2010-06-23 17:42:39

1

我設法得到這個工作:

listOfLists = listOfLists.OrderByDescending(a => a.Max(x => x.paramToSoryBy)).ToList();