假设我们有一个MyData实现IComparable<MyData>和IComparable接口的类.然后我们有一个包含许多MyData元素的列表和一个LINQ查询来获取一个排序列表.
public class MyData : IComparable<MyData>, IComparable
{
...
public int CompareTo(MyData value)
{
// TODO
}
public int CompareTo(object value)
{
if (value == null)
return 1;
if (value.GetType() == typeof(MyData))
{
MyData rightValue = (MyData)value;
return (this.CompareTo(rightValue));
}
else throw new ArgumentException("Object is not a " + typeof(MyData) + ".");
}
}
// main method
List<MyData> list = new List<MyData>();
...
var items = from item in list
orderby item descending
select item;
Run Code Online (Sandbox Code Playgroud)
当LINQ对其中的元素进行排序时list,它是否使用IComparable了MyData类中接口的实现?
如果答案是肯定的,是否最好将排序条件封装在类中MyData(通过实现上述接口)或在LINQ查询中指定条件(没有MyData实现这些接口)?这两种选择的优缺点是什么?
Enumerable.OrderBy "使用默认比较器Default来比较键",而后者将使用您的IComparable<T>实现.
如果答案是肯定的,是否最好将排序条件封装在MyData类中(通过实现上述接口)或在LINQ查询中指定条件(没有实现这些接口的MyData)?这两种选择的优缺点是什么?
首先,答案是肯定的.
两种方法都有优势.
实现IComparable<T>表明该类型具有自然顺序.如果是这样,我喜欢实现这个接口.就LINQ而言,主要的专业是你简化你的LINQ查询(一点点).但是,我的主要专业人员更倾向于对该给定类型的"自然"顺序的建议,这反过来又增加了API的清晰度.
在LINQ查询中指定标准的主要原因是灵活性.这允许您按任意数量的标准排序 - 不限制自己使用类型本身定义的给定排序.如果没有类型的"自然"排序顺序(即:它不代表某个"数量"本身或类似的东西),那么我个人使用这种方法.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |