C# LINQ获取单个结果或null
当列表有1个元素时,是否有只返回1个元素的LINQ函数,如果列表为空或有多个元素,则返回null?C# LINQ获取单个结果或null,c#,linq,C#,Linq,当列表有1个元素时,是否有只返回1个元素的LINQ函数,如果列表为空或有多个元素,则返回null? 当列表包含多个元素时,SingleOrDefault会引发异常…您可以自己编写此方法 var list=newlist(); var result=list.Count()==1?list.FirstOrDefault():null; 更高性能的选项,只获取集合中的前两个元素(如评论中提到的@canton7) var result=list.Take(2).Count()=1?list.Firs
当列表包含多个元素时,SingleOrDefault会引发异常…您可以自己编写此方法
var list=newlist();
var result=list.Count()==1?list.FirstOrDefault():null;
更高性能的选项,只获取集合中的前两个元素(如评论中提到的@canton7)
var result=list.Take(2).Count()=1?list.FirstOrDefault():null;
也可以使用,而不是,但这两种方法的作用相同,将源序列强制转换为IList
,并获取第一个元素
由于每个问题的源集合是List
,因此使用List
索引器和Count
属性是有意义的
var result=list.Count==1?列表[0]:空;
没有内置功能,但如果不迭代两次就不难实现:
public static T SingleOrNothing(this IEnumerable<T> source, Func<T, bool> pred)
{
bool found = false;
T result = default(T);
foreach(T item in source)
{
if(pred(item))
{
if(found)
// an item was already found - return nothing
return default(T);
// one was not found yet - keep this item as possible result
result = item;
found = true;
}
}
//either one item was found or none (result will be default)
return result;
}
publicstatict SingleOrNothing(此IEnumerable源代码,Func pred)
{
bool-found=false;
T结果=默认值(T);
foreach(源中的T项)
{
if(预测(项目))
{
如果(找到)
//已找到项目-不返回任何内容
返回默认值(T);
//尚未找到一个-保留此项目作为可能的结果
结果=项目;
发现=真;
}
}
//找到一个项目或没有(结果将是默认值)
返回结果;
}
类似的方法应该可以:
var myList = new List<object>();
//get data into list
var result = myList.Count() == 1 ? myList.Single() : null;
if (result != null)
{
myList.Add(result);
}
var myList=new List();
//将数据放入列表
var result=myList.Count()==1?myList.Single():null;
如果(结果!=null)
{
添加(结果);
}
让我给你一点建议:)
尝试使用LINQPad(有一个免费版本),当你有这样的查询时,它将帮助你提高你的技能
您的需求可以使用一些扩展方法(Skip、Take、Count)进行评估,请查看以下伪代码:
public class ListDemo
{
public static void Main(string[] args)
{
//Try erasing some elements of this list, leave one element alone
List<string> AccountNumbers = new List<string>(){ "CC13563", "CC13578", "CC13525", "CC13585", "CC13500" };
var account = AccountNumbers.Skip(1).Any() ? null : AccountNumbers.SingleOrDefault();
//If Account is null it won't display anything...
Console.Write("The element of your list: " + account + "\n");
}
}
公共类列表演示
{
公共静态void Main(字符串[]args)
{
//尝试删除此列表中的某些元素,保留一个元素
List AccountNumber=新列表(){“CC13563”、“CC13578”、“CC13525”、“CC13585”、“CC13500”};
var account=AccountNumbers.Skip(1).Any()?null:AccountNumbers.SingleOrDefault();
//如果帐户为空,则不会显示任何内容。。。
Console.Write(“列表的元素:“+account+”\n”);
}
}
这是LINQPad请试试,不要只拿鱼来学习如何钓鱼。对于你想要的行为,没有内置的linq函数。你是指一个一般元素还是一个与某些条件匹配的元素?一个与某些条件匹配的元素实际上与计数检查相匹配,你可以只使用
Single
而不是FirstOrDefault
。注意这一点可能不必要地昂贵:一旦看到2,您可以停止检查elements@canton7谢谢,这是一个很好的观点,list.Take(2.Count()==1
更有意义here@juharr这是一个很好的观点,谢谢。“引擎盖下”的操作与之几乎相同,将其转换为IList
,并获得第一个item@canton7第一个Single
不会迭代整个集合。它将在看到第二项时立即停止。此外,在本例中,仅当您只有一个项目时才会调用Single
。最后,如果您弄乱了逻辑并在有多个项时调用它,它还可以抛出一个异常。