如何获取集合的空列表?

Hom*_*mam 8 c# linq linq-to-objects

我有一个匿名类的集合,我想返回一个空列表.

什么是最好的可读表达式?

我虽然如下,但我认为它们不够可读:

var result = MyCollection.Take(0).ToList();

var result = MyCollection.Where(p => false).ToList();
Run Code Online (Sandbox Code Playgroud)

注意:我不想清空集合本身.

任何建议!

小智 35

关于:

Enumerable.Empty<T>();
Run Code Online (Sandbox Code Playgroud)

这将返回一个类型为T的空枚举.如果您真的需要List,那么您可以自由地执行此操作:

Enumerable.Empty<T>().ToList<T>();
Run Code Online (Sandbox Code Playgroud)

  • 如果你想返回空的IEnumerable,这样会更好.它相当于为列表返回新的List <T>().ToList <T>扩展方法在引擎盖下执行一个新的List <T>. (3认同)

mmi*_*mix 13

实际上,如果你使用通用扩展,你甚至不必使用任何Linq来实现这一点,你已经通过T暴露了匿名类型

public static IList<T> GetEmptyList<T>(this IEnumerable<T> source)
{
    return new List<T>();
}

var emp = MyCollection.GetEmptyList();
Run Code Online (Sandbox Code Playgroud)


Rob*_*ine 10

鉴于您的第一个建议有效且应该表现良好 - 如果可读性是唯一的问题,为什么不创建扩展方法:

public static IList<T> CreateEmptyCopy(this IEnumerable<T> source)
{
   return source.Take(0).ToList();
}
Run Code Online (Sandbox Code Playgroud)

现在你可以重构你的例子了

var result = MyCollection.CreateEmptyCopy();
Run Code Online (Sandbox Code Playgroud)


Pau*_*tos 6

出于性能原因,您应该坚持使用您提出的第一个选项.

另一个将在返回空列表之前迭代整个集合.

因为匿名类型在源代码中没有办法创建列表.但是,有一种方法可以通过反射创建这样的列表.