2010-06-23 121 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();