我正在使用QuickSort和LINQ,并希望将序列分成前一个,等于和后一个项目。
这是我到目前为止所拥有的:
public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> ComparativeWhere<T>(this IEnumerable<T> source, T t)
where T : IComparable<T>
{
return new Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>>(
source.Where(x => x.CompareTo(t) < 0),
source.Where(x => x.CompareTo(t) == 0),
source.Where(x => x.CompareTo(t) > 0)
);
}
最好的方法是什么?这是最好的实施,还是有更好的实施?或者我应该使用我不知道的库函数吗?
答案 0 :(得分:1)
Hey Jay,Wes Dyer关于此的文章可能对您有所帮助。
答案 1 :(得分:0)
如果性能是一个问题(当它通常是排序时,虽然这只是为了好玩),我建议可能不会使用任何内置的东西,因为你这样做的方式是你的召唤3次,这导致可枚举迭代3次。我会这样做:
public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> ComparativeWhere<T>(this IEnumerable<T> source, T t)
where T : IComparable<T>
{
var list1 = new List<T>();
var list2 = new List<T>();
var list3 = new List<T>();
foreach (var item in source)
{
if (item.CompareTo(t) < 0)
{
list1.Add(item);
}
if (item.CompareTo(t) == 0)
{
list2.Add(item);
}
if (item.CompareTo(t) > 0)
{
list3.Add(item);
}
}
return new Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>>(list1, list2, list3);
}
当然,这种方法的两个缺点是你正在创建3个新列表,并且不再懒散地执行,但生活中的一切都是折衷不是吗? :)