c# – 实现IComparer组合多个Linq OrderBy
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 实现IComparer组合多个Linq OrderBy,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1578字,纯文字阅读大概需要3分钟。
内容图文
我的问题是我总是想以某种方式订购一组对象.
例如:
class foo{
public string name {get;set;}
public DateTime date {get;set;}
public int counter {get;set;}
}
…
IEnumerable<foo> dosomething(foo[] bar){
return bar.OrderBy(a=>a.name).ThenBy(a=>a.date).ThenBy(a=>a.counter);
}
我遇到的问题是它总是很长时间地处理排序顺序.一个简洁的解决方案似乎只是创建一个实现IComparer< foo>的类,这意味着我可以这样做:
IEnumerable<foo> dosomething(foo[] bar){
return bar.OrderBy(a=>a, new fooIComparer())
}
.
问题是,这个实现的顺序方法如下
…
public int Compare(foo x, foo y){ }
意思是它在非常精细的基础上进行比较.
当前的实现(虽然我正在编写伪代码,但可能会有效)
public int Compare(foo x, foo y){
if (x==y)
return 0;
var order = new []{x,y}.OrderBy(a=>a.name).ThenBy(a=>a.date).ThenBy(a=>a.counter);
return (order[0] == x) ? -1 : -1;//if x is first in array it is less than y, else it is greater
}
这不是很有效,另一个可以提供更整洁的解决方案吗?理想情况下,没有比较(x,y)方法?
解决方法:
你必须实现IComparable< foo>并比较所有属性:
class foo: IComparable<foo>, IComparer<foo>
{
public string name { get; set; }
public DateTime date { get; set; }
public int counter { get; set; }
public int Compare(foo x, foo y)
{
if (x == null || y == null) return int.MinValue;
if (x.name != y.name)
return StringComparer.CurrentCulture.Compare(x.name, y.name);
else if (x.date != y.date)
return x.date.CompareTo(y.date);
else if (x.counter != y.counter)
return x.counter.CompareTo(y.counter);
else
return 0;
}
public int CompareTo(foo other)
{
return Compare(this, other);
}
}
然后你可以用这种方式使用OrderBy:
var ordered = foos.OrderBy(f => f).ToList();
内容总结
以上是互联网集市为您收集整理的c# – 实现IComparer组合多个Linq OrderBy全部内容,希望文章能够帮你解决c# – 实现IComparer组合多个Linq OrderBy所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。