2015-09-03 1 views
1

Каким будет оптимальный способ получить единственный элемент в списке? если он не равен единице, запишите его.LINQ Использование Single with Try..Catch vs First with Count! = 1

Лучше ли использовать блок try..catch против Single? или использовать граф?

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(); 
+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(); 
+0

'try {...} catch {...}' по крайней мере обрабатывает случай 'list == null' – fubo

+0

@fubo: это дешевле проверить с' if (null == list) {...} ' , Обычно 'list == null' является * специальным случаем * и должен рассматриваться особым образом (если у меня нет списка вообще ...). Лучше иметь исключение: * Список должен быть, однако это не так. Что-то не так с моим кодом *, который проглатывает исключение в 'try catch' –

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

Как прокомментировал Iridium, Single() или SingleOrDefault() не может быть лучший выбор здесь, потому что он бросает исключение, если есть более чем один элемент или список равен нулю.

я заменил, что с null -check и сравнение с count

+0

Возможно, стоит отметить, что 'SingleOrDefault()' все еще выдает исключение, если имеется более одного элемента, однако в отличие от 'Single()' он также не бросает, если их нет. – Iridium

0

Этот способ лучше

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