2013-02-05 2 views

ответ

5

Вы не можете получить доступ к переменной «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() до ;.

1

Сколько совпадений вы ожидаете: например, сколько пользователей в вашем списке вы ожидаете иметь тип 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(); 
0

Просто добавить к хорошим ответам уже опубликованным.

Для того, чтобы последний образец кода от 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(); 
Смежные вопросы