Зачем нам нужен Single () в LINQ? - PullRequest
8 голосов
/ 15 мая 2011

Почему основная цель метода расширения Single()?

Я знаю, что это вызовет исключение, если больше, чем элемент, который соответствует предикату в последовательности, но Я до сих пор не понимаю, в каком контексте это может быть полезно .

Edit:
Я понимаю, что делает Single, поэтому вам не нужно объяснять в своем вопросе, что делает этот метод.

Ответы [ 4 ]

15 голосов
/ 15 мая 2011

Это полезно для декларативного изложения

Мне нужен один элемент в списке, и если более одного элемента совпадают, значит что-то не так

Во многих случаях программы должны свести набор элементов к интересному на основе определенного предиката. Если более одного совпадения, это указывает на ошибку в программе. Без метода Single программа должна была бы обходить части потенциально дорогого списка более одного раза.

Сравните

Item i = someCollection.Single(thePredicate);

К

Contract.Requires(someCollection.Where(thePredicate).Count() == 1);
Item i = someCollection.First(thePredicate);

Последний требует двух операторов и дважды повторяет потенциально дорогой список. Нехорошо.

Примечание: Да First на потенциально быстрее, потому что он должен выполнять итерацию только до первого соответствующего элемента. Остальные элементы не имеют никакого значения. С другой стороны, Single должен учитывать все перечисление. Если несколько совпадений не имеют значения для вашей программы и указывают на отсутствие ошибок программирования, тогда да, используйте First.

3 голосов
/ 15 мая 2011

Использование Single позволяет документировать ваши ожидания по количеству результатов, а также рано потерпеть неудачу, если они ошибочны, не потерпеть неудачу. Если вы не любите долгие сеансы отладки ради них самих, я бы сказал, что это чрезвычайно полезно для повышения надежности вашего кода.

2 голосов
/ 15 мая 2011

Каждый оператор LINQ возвращает последовательность, поэтому IEnumerable<T>.Чтобы получить фактический элемент, вам нужен один из методов First, Last или Single - вы используете последний, если точно знаете, что последовательность содержит только один элемент.Примером может служить 1: 1 ID: сопоставление имен в базе данных.

0 голосов
/ 15 мая 2011

Single вернет один экземпляр класса / объекта, а не коллекцию.Очень удобно, когда вы получаете одну запись по Id.Я никогда не ожидаю более одного ряда.

...