C# 如果列表为空,是否从ToList()返回null?

C# 如果列表为空,是否从ToList()返回null?,c#,linq,C#,Linq,是否有一种简洁的方法返回列表?如果列表为空,则返回null var list = new List<int>{ 1, 2, 2, 4, 4 }; return list.Where(x => x == 3).ToList(); //returns 0 if empty - want to return null var list=新列表{1,2,2,4,4}; return list.Where(x=>x==3.ToList()//如果为空,则返回0-要返回null吗 我

是否有一种简洁的方法返回列表?如果列表为空,则返回null

var list = new List<int>{ 1, 2, 2, 4, 4 };

return list.Where(x => x == 3).ToList(); //returns 0 if empty - want to return null
var list=新列表{1,2,2,4,4};
return list.Where(x=>x==3.ToList()//如果为空,则返回0-要返回null吗
我可以这样做:

var list = new List<int>{ 1, 2, 2, 4, 4 };

var newList = list.Where(x => x == 3).ToList();
return (newList.Any()) ? newList : null;
var list=新列表{1,2,2,4,4};
var newList=list.Where(x=>x==3.ToList();
return(newList.Any())?newList:null;
但是,除了列表之外,是否有可能直接从LINQ查询中获得类似于FirstOrDefault的null


list.Where(x=>x==3.FirstOrDefault()

我不知道当列表为空时返回
null
的要求是什么,但您可以编写扩展方法来实现这一点:

static class MyExtensions
{
    public static List<T> NullIfEmpty<T>(this List<T> list) => 
        list.Any() ? list : null;
    
    // this will be more optimal solution
    public static List<T> ToListOrNullIfEmpty<T>(this IEnumerable<T> collection) =>
        collection.Any() ? collection.ToList() : null;

}


序列(
IEnumerable
)的一个有趣但经常被忽略的特性是,只需要对它们进行一次枚举——因此任何涉及
.Any()
检查或类似检查的内容都不是严格可靠的(尽管对于许多数据源来说:你可以侥幸逃脱)。但要说实话,你需要做一些事情,比如(扩展给出的答案:

静态类MyExtensions
{    
//这将是更理想的解决方案
公共静态列表ToListOrNullIfEmpty(此IEnumerable源)
{
使用(var iter=source.GetEnumerator())
{
if(!iter.MoveNext())返回null;
var list=新列表();
做
{
列表。添加(国际热核实验堆当前版本);
}
while(iter.MoveNext())
退货清单;
}
}
}

当然,您可以通过对一些已知类型进行类型测试来优化此功能,例如
List
T[]
IList
,等等-如果您选择的话。

没有内置的方法,但是请不要在需要列表的地方返回null。您可以编写扩展方法来实现这一点。但是您面临的实际问题是什么?我强烈建议不要这样做,除非有充分的理由(例如存储null db字段)在这样的情况下,测试一个列表是否为空比在这里有一个空的处理要好得多:它更干净、更清晰,并且避免了很多麻烦、问题和错误。这是一个很好的问题,我必须考虑。我这样做的原因是因为它更容易被赋值为<代码> list?=另一个列表< /> >而不是使用<代码>列表=list.Any()?list:anotherList
list ToListOrNullIfEmpty(这个IEnumerable集合)
将更加优化,不是吗?因此:
list.Where(x=>x==3)。ToListOrNullIfEmpty()是的,我在考虑是否将其添加到答案中。谢谢。我想返回null的唯一原因是,使用
list???=anotherList
赋值比使用
list=list.Any()更容易。list:anotherList
。这样做是不是不好的做法?我建议使用
list?.Any()??false?list:null
以处理
list
本身为null的情况。注意:将序列迭代两次是不可靠的;大多数内置LINQ运算符故意避免这种情况-请参阅我的答案了解“如何”
list.Where(x => x == 3).ToList().NullIfEmpty();
list.Where(x => x == 3).ToListOrNullIfEmpty();