创建一个排序,然后检索列表的第一个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一开始是不完整的。

创建一个排序,然后检索列表的第一个n方法< >其中T: i & T;T>

从输入中创建一个新的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()

相关文章: