我有一个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
答案 0 :(得分:30)
使用linq。
如果您有类
的对象列表L.public class temp
{
public bool x;
public string y;
}
然后使用:
L.orderby(a=>a.x).thenby(a=>a.y);
你可以随意链接它。
答案 1 :(得分:18)
result.Sort((x,y) => x.CheckedIn==y.CheckedIn ?
string.Compare(x.LastName, y.LastName) :
(x.CheckedIn ? -1 : 1) );
答案 2 :(得分:15)
var sortResult = result.OrderBy(a => a.CheckedIn).ThenBy(a => a.LastName).ToList();
答案 3 :(得分:3)
我有一个类使用List<List<string>>
变量中的_Records
创建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);
答案 4 :(得分:1)
这是我用于按任意数量的键对列表进行排序的扩展方法:
public static class ListExtensions
{
public static void SortBy<T>(this List<T> list, params Expression<Func<T, IComparable>>[] 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<Person> persons = GetPersons();
myList.SortBy(p => p.LastName, p => p.FirstName);
请注意,这大致相当于:myList = myList.OrderBy(p => p.LastName).ThenBy(p => p.FirstName)
。
答案 5 :(得分:0)
通过这样做,我能够做一些快速/肮脏的事情..由于两列都是文本,只需将它们加在一起即可快速排序。
this.Project.Tasks.Sort((x,y)=&gt; String.Compare((x.Assignee + x.Task),(y.Assignee + y.Task)));
答案 6 :(得分:0)
这是我的比较链解决方案。它将负责汇总您感兴趣的所有比较类。构建器模式可以很容易地提供列进行排序并获得一个排序列表作为回报。