创建一个排序,然后为List <t>检索前n个方法,其中T:IComparable <t> </t> </t>

时间:2011-10-02 18:04:35

标签: c#

我想写一个带有以下签名的泛型方法:

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起初是不完整的。

1 个答案:

答案 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()