Выберите один элемент из списка
Используя LINQ, какой лучший способ выбрать один элемент из списка, если элемент может не существовать в списке?
Я придумал два решения, ни один из которых мне не нравится. Я использую предложение where, чтобы выбрать список элементов (который, как я знаю, будет только одним), я могу проверить счетчик и сделать одиночный вызов в этом списке, если счет один, другой выбор - использовать foreach и просто перерыв после получения элемента.
Ни один из них не кажется хорошим подходом, есть ли лучший способ?
Ответы
Ответ 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();
}