2013-02-05 38 views
-1

怎麼用的「X」,如果塊變量?如果語句爲真,我想返回x的Id字段。使用LINQ變量斷章取義

if (UserList.Any(x => x.Type == (int)UserType.SuperUser)) 
{ 
    return x.Id; 
} 
+1

一些更多的信息會很好.... – Vogel612

回答

5

您不能在lambda表達式外訪問「LINQ變量」。

你想要做的是獲得任何元素xId屬性,它包含條件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值,使用WhereSelect extention方法:

return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(x => x.Id); 

Where(x => condition(x))返回包含如果你prefere滿足條件的所有元素的IEnumerable得到一個「正常」的名單,;前加ToList()

1

多少場比賽,你希望:即有多少用戶在列表中你希望擁有超級用戶類型?

如果你認爲會有匹配(所以有零個匹配用戶或一個以上匹配的用戶將是一個錯誤)只有一個用戶,然後利用單:

return UserList.Single(x => x.Type == (int)UserType.SuperUser).Id; 

(請注意,這將引發異常,如果不是正好有一個匹配的用戶;或者你可以使用的SingleOrDefault然後測試空)

如果你認爲會有一個或多個,你只想返回第一個:

return UserList.First(x => x.Type == (int)UserType.SuperUser).Id; 

(注意:如果不是正好有一個匹配的用戶,這將拋出一個異常;或者您可以使用FirstOrDefault,然後測試空)

如果你認爲會有一個或更多,您想返回所有匹配用戶的所有ID數組:

return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(u => u.Id).ToArray(); 
0

剛添加已發佈的好答案。

爲了從薩姆Holloways最後一個代碼示例答案看起來像你使用的是X直接,你可以重寫到類似SQL的語法(不記得什麼叫):

IEnumerable<int> userIds = from x in UserList 
            where x.Type == UserType.SuperUser 
            select x.Id; 

您可以使用的用戶id的計數方法,以確定是否有滿足你的病情的人。

既然你正在返回的ID,和我猜的ID是一個i​​nt,你將不得不反正返回的東西,而且我猜你會回到0,如果它不存在,你可以使用:

return UserList.Where(x => x.Type == UserType.SuperUser).Select(x => x.Id).FirstOrDefault();