Подтвердить что ты не робот

Выберите один элемент из списка

Используя LINQ, какой лучший способ выбрать один элемент из списка, если элемент может не существовать в списке?

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

Ни один из них не кажется хорошим подходом, есть ли лучший способ?

4b9b3361

Ответ 1

Вы можете использовать IEnumerable.First() или IEnumerable.FirstOrDefault().

Разница в том, что First() будет метаться, если ни один элемент не найден (или если ни один элемент не соответствует условиям, если вы используете условия). FirstOrDefault() вернет default(T) (null, если это ссылочный тип).

Ответ 2

Используйте селектор FirstOrDefault.

var list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var firstEven = list.FirstOrDefault(n => n % 2 == 0);

if (firstEven == 0)
    Console.WriteLine("no even number");
else 
    Console.WriteLine("first even number is {0}", firstEven);

Просто передайте предикат First или FirstOrDefault, и он будет счастливо обойти список и выбрать для вас первый матч.

Если нет совпадения, FirstOrDefault вернет значение по умолчанию любого типа данных, в котором находятся элементы списка.

Надеюсь, что это поможет: -)

Ответ 3

List<string> items = new List<string>();

items.Find(p => p == "blah");

или

items.Find(p => p.Contains("b"));

но это позволяет вам определить, что вы ищете, используя предикат соответствия...

Я думаю, если вы говорите linqToSql, то:

пример поиска учетной записи...

DataContext dc = new DataContext();

Account item = dc.Accounts.FirstOrDefault(p => p.id == 5);

Если вам нужно убедиться, что существует только один элемент (исключение исключений, когда больше 1)

DataContext dc = new DataContext();

Account item = dc.Accounts.SingleOrDefault(p => p.id == 5);

Ответ 4

Просто для завершения ответа. Если вы используете синтаксис LINQ, вы можете просто обернуть его, поскольку он возвращает IEnumerable:

(from int x in intList
 where x > 5
 select x * 2).FirstOrDefault()

Ответ 5

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

Вы можете использовать метод расширения First<T>() или FirstOrDefault<T>() для получения первого результата или default(T).

var list = new List<int> { 1, 2, 4 };
var result = list.Where(i => i == 3).First(); // throws InvalidOperationException
var result = list.Where(i => i == 3).FirstOrDefault(); // = 0

Ответ 6

Может быть, я здесь что-то пропустил, но обычно вызов .SingleOrDefault() - это способ вернуть либо один элемент в списке, либо значение по умолчанию (null для ссылочных или нулевых типов), так как список пуст. Он генерирует исключение, если список содержит более одного элемента.

Используйте FirstOrDefault(), чтобы позаботиться о случае, когда у вас может быть более одного)

Ответ 7

SingleOrDefault() - это то, что вам нужно

веселит

Ответ 8

просто увидел это сейчас, если вы работаете со списком объекта, вы можете попробовать это

 public class user
{
    public string username { get; set; }
    public string password { get; set; }
}

  List<user> userlist = new List<user>();

        userlist.Add(new user { username = "macbruno", password = "1234" });
        userlist.Add(new user { username = "james", password = "5678" });
        string myusername = "james";
        string mypassword = "23432";

  user theUser = userlist.Find(
            delegate (user thisuser)
            {
                return thisuser.username== myusername && thisuser.password == mypassword;
            }
            );

            if (theUser != null)
            {
               Dosomething();
            }
            else
            {
                DoSomethingElse();

            }