我想写一个带有以下签名的泛型方法:
IList<T> Sort<T> (IList<T> list) where T: IComparable <T>
返回排序列表。 抱歉原帖不完整。 所以我想对列表进行排序,然后选择前n个元素 那将是
List<T> temp = new List<T>(list);
temp.Sort();
List<T> temp2 = new List<T>(temp);
temp2.Take(count);
完整的问题是如何在没有双重复制初始列表的情况下做到这一点。 将有2个案例: 列表有dupes,我想检索前n个不同的值 列表有dupes,我想检索前n个值。 对于第一种情况,也应该应用不同的 - 所以要避免使用新的“第三”副本。
当然,接受guffa发布的答案,因为OP起初是不完整的。答案 0 :(得分:4)
从输入中创建一个新的List<T>
并对其进行排序:
public IList<T> Sort<T> (IList<T> list) where T: IComparable <T> {
List<T> temp = new List<T>(list);
temp.Sort();
return temp;
}
Sort
方法将在您未指定默认比较器时使用默认比较器,如果有,则使用IComparable<T>
实现。
回答编辑过的问题:
如果要保留输入并返回列表,则必须复制列表两次。
如果您返回IEnumerable<T>
而不是IList<T>
,则可以绕过第二次复制。然后,您可以返回从列表的第一个副本读取的延迟结果。缺点当然是它会将整个第一个列表保留在内存中,尽管你只使用它的一部分。
无论如何,返回IList<T>
的版本将是:
public IList<T> Sort<T> (IList<T> list, int cnt, bool distinct) where T: IComparable <T> {
IEnumerable<T> temp = list.OrderBy(t => t);
if (distinct) {
temp = temp.Distinct();
}
return temp.Take(cnt).ToList();
}
对于返回IEnumerable<T>
的版本,您不会在最后一步中执行.ToList()
。