Как использовать переменную x в if block? Я хочу вернуть поле Id в x, если утверждение истинно.Использовать переменные LINQ из контекста
if (UserList.Any(x => x.Type == (int)UserType.SuperUser))
{
return x.Id;
}
Как использовать переменную x в if block? Я хочу вернуть поле Id в x, если утверждение истинно.Использовать переменные LINQ из контекста
if (UserList.Any(x => x.Type == (int)UserType.SuperUser))
{
return x.Id;
}
Вы не можете получить доступ к переменной «LINQ» вне выражения лямбда.
Что вы хотите сделать, так это получить свойство Id
любого элемента x
, что satsify условие x.Type == (int)UserType.SuperUser
.
В этом случае замените Any()
на FirstOrDefault()
.
var item = UserList.FirstOrDefault(x => x.Type == (int)UserType.SuperUser);
if(item != null)
return item.Id;
FirstOrDefault(x => condition on x)
возвращает первый элемент, который satsify состояния и null
, если ни один элемент не удовлетворяет условие.
Если вы хотите, чтобы получить значение всех элементов, которые удовлетворяют условию Id
, используйте Where
и Select
Удлинитель методы:
return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(x => x.Id);
Where(x => condition(x))
возвращает IEnumerable
, которые содержат все элементы, которые удовлетворяют условию, если вы предпочитаете для получения «нормального» списка, добавьте ToList()
до ;
.
Сколько совпадений вы ожидаете: например, сколько пользователей в вашем списке вы ожидаете иметь тип SuperUser?
Если вы ожидаете там, чтобы быть точно один пользователь, который соответствует (так что наличие нулевых пользователей соответсвующей или более одного совпадения будет ошибка), а затем использовать Single:
return UserList.Single(x => x.Type == (int)UserType.SuperUser).Id;
(Обратите внимание, это будет бросаться исключение, если не точно один соответствующий пользователь, в качестве альтернативы вы можете использовать SingleOrDefault и затем тест на нуль)
Если вы ожидаете там быть один или более, и вы просто хотите вернуть первый один:
return UserList.First(x => x.Type == (int)UserType.SuperUser).Id;
.
(Обратите внимание, что это вызовет исключение, если не существует точно одного совпадающего пользователя; в качестве альтернативы вы можете использовать FirstOrDefault, а затем проверить на нуль)
Если вы ожидаете там быть один или более, и вы хотите, чтобы вернуть массив всех идентификаторов всех пользователей согласующих:.
return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(u => u.Id).ToArray();
Просто добавить к хорошим ответам уже опубликованным.
Для того, чтобы последний образец кода от Sam Holloways ответить смотреть, как вы используете х непосредственно можно переписать, что в SQL-подобный синтаксис (не помню, как это называется):
IEnumerable<int> userIds = from x in UserList
where x.Type == UserType.SuperUser
select x.Id;
Вы можете использовать метод count для userIds, чтобы определить, есть ли кто-либо, удовлетворяющий вашему состоянию.
Поскольку вы возвращаете идентификатор, и я предполагаю, что идентификатор является ИНТ, и вы должны будете вернуть то, что в любом случае, и что я думаю, вы бы возвращать 0, если его нет, вы можете использовать:
return UserList.Where(x => x.Type == UserType.SuperUser).Select(x => x.Id).FirstOrDefault();
Дополнительная информация будет приятной .... – Vogel612