Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ获取单个结果或null_C#_Linq - Fatal编程技术网

C# 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

当列表有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.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
。最后,如果您弄乱了逻辑并在有多个项时调用它,它还可以抛出一个异常。