LINQ使用带Try.Catch的Single与带Count的First=1.

本文关键字:Count 与带 First Single LINQ Try Catch | 更新日期: 2023-09-27 18:11:09

获取列表中唯一元素的最佳方式是什么?如果它不等于1,记录它。

试试好吗。。接球挡对单打?或者使用Count?

try
{
    var item = list.Single();
}
catch(System.InvalidOperationException)
{
    //log
    Console.WriteLine("The collection does not contain exactly one element.");
}

if(list.Count!=1)
{
    //log
    Console.WriteLine("The collection does not contain exactly one element.");
}
var item = list.FirstOrDefault();

LINQ使用带Try.Catch的Single与带Count的First=1.

好吧,try {...} catch {...}将执行堆栈跟踪,这意味着有很多开销。因此,第二种可能性是更好的(当使用List<T>时,Count是一个很好的选择(。实际上,您根本不需要Linq

  // list.Count is just a integer field, a very cheap comparison 
  if (list.Count != 1) {
    // 0 or many items (not a single one)
    ...
  }
  else {
    // list contains exactly one item 
    var item = list[0]; 
    ...
  }

小心陷阱像这样:

  List<Object> list = new List<Object>() {
    null,
    123
  };
  // item == null even if list has TWO items
  var item = list.FirstOrDefault(); 
if (list == null || list.Count != 1)
{
    Console.WriteLine("The collection does not contain exactly one element.");
}

正如Iridium所评论的,Single()SingleOrDefault()可能不是这里的最佳选择,因为如果有多个元素或列表等于null,它会抛出异常。

我用null检查和与count 的比较来代替它

这种方式是更好的

if(list.Count!=1)
{
    //log
    Console.WriteLine("The collection does not contain exactly one element.");
}
var item = list.FirstOrDefault();