创建一个排序,然后检索列表的第一个n方法< >其中T: i & T;T>
本文关键字:方法 其中 第一个 一个 排序 列表 检索 然后 创建 | 更新日期: 2023-09-27 18:10:10
我想写一个泛型方法,签名如下:
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);
完整的问题是如何在不重复复制初始列表的情况下做到这一点。有两种情况:这个列表有重复,我想检索前n个不同的值这个列表有重复,我想检索前n个值。对于第一种情况,还应该应用一个不同的-因此要避免使用list的新"第三"副本。
当然guffa的答案是可以接受的,因为OP一开始是不完整的。
从输入中创建一个新的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()
。