C#列表按两列排序

我有一个C#自定义对象列表,我需要按两个不同的变量排序,一个是布尔值,另一个是字符串。 我可以按任何一个标准排序,但我无法弄清楚如何将它们组合起来。 排序应首先是所有布尔值(CheckedIn),然后是每个值的最后一个名称。 现在我用

result.Sort((x, y) => string.Compare(x.CheckedIn.ToString(), y.CheckedIn.ToString())); result.Sort((x, y) => string.Compare(x.LastName, y.LastName)); 

但是我怎么能把它结合起来,这样我的结果就像

 CheckedIn-Name No - Aames No - Smith Yes - Barnes Yes - Peters 

 result.Sort((x,y) => x.CheckedIn==y.CheckedIn ? string.Compare(x.LastName, y.LastName) : (x.CheckedIn ? -1 : 1) ); 

使用linq。

如果你有列表L的对象

 public class temp { public bool x; public string y; } 

然后使用:

 L.orderby(a=>ax).thenby(a=>ay); 

你可以随意链接它。

 var sortResult = result.OrderBy(a => a.CheckedIn).ThenBy(a => a.LastName).ToList(); 

我有一个类使用_Records变量中的List>创建CSV文件。 我需要在事后对其进行排序,而LINQ并不好。

这是我通过传入我想要排序的列的索引而创建的多排序。

 public void OrderBy(params int[] columnIndexes) { _Records.Sort((x, y) => { foreach (int i in columnIndexes) { int result = string.Compare(x[i], y[i]); if (result != 0) return result; } return 0; }); } 

那么用法就是……

 csv.OrderBy(1, 3, 5); 

这是我用于按任意数量的键对列表进行排序的扩展方法:

 public static class ListExtensions { public static void SortBy(this List list, params Expression>[] keys) { if (list == null) throw new ArgumentNullException("list"); if(keys == null || !keys.Any()) throw new ArgumentException("Must have at least one key!"); list.Sort((x, y) => (from selector in keys let xVal = selector.Compile()(x) let yVal = selector.Compile()(y) select xVal.CompareTo(yVal)) .FirstOrDefault(compared => compared != 0)); } } 

用法:

 var List persons = GetPersons(); myList.SortBy(p => p.LastName, p => p.FirstName); 

请注意,这大致相当于: myList = myList.OrderBy(p => p.LastName).ThenBy(p => p.FirstName)

通过这样做,我能够做一些快速/肮脏的事情..由于两列都是文本,只需将它们一起添加即可在一个快速通道中排序。

this.Project.Tasks.Sort((x,y)=> String.Compare((x.Assignee + x.Task),(y.Assignee + y.Task)));

C#中的比较链

这是我的比较链解决方案。 它将负责汇总您感兴趣的所有比较类。 构建器模式可以轻松地提供列进行排序并获取排序列表作为回报。