LINQ使用Single with Try..Catch vs First with Count!= 1

时间:2015-09-03 06:42:29

标签: c# linq list

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

对Single使用try..catch块会更好吗?或使用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();

3 个答案:

答案 0 :(得分:2)

好吧,try {...} catch {...}将执行堆栈跟踪,这意味着开销很大。 所以第二种可能性更好(Count在使用List<T>时是一个不错的选择。实际上,你根本不需要 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(); 

答案 1 :(得分:1)

if (list == null || list.Count != 1)
{
    Console.WriteLine("The collection does not contain exactly one element.");
}

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

我将其替换为null - 检查并与count

进行比较

答案 2 :(得分:0)

这种方式更好

window.location.href = path