ifブロックで「x」変数を使用するにはどうすればよいですか? ステートメントがtrueの場合、xのIdフィールドを返したいです。
if (UserList.Any(x => x.Type == (int)UserType.SuperUser))
{
return x.Id;
}
ラムダ式の外で「LINQ 変数」にアクセスすることはできません。
やりたいことは、条件を満たすId
要素のプロパティを取得することです。x
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)
条件を満たす最初の要素を返し、条件を満たすnull
要素がない場合は返します。
Id
条件を満たすすべての要素の値を取得する場合は、拡張メソッドWhere
とSelect
拡張メソッドを使用します。
return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(x => x.Id);
Where(x => condition(x))
「通常の」リストを取得したい場合は、 の前IEnumerable
に追加して、条件を満たすすべての要素を含む を返します。ToList()
;
予想される一致数: つまり、リスト内の何人のユーザーが SuperUser タイプを持つと予想されますか?
一致するユーザーが 1 人だけであると予想される場合 (したがって、一致するユーザーが 0 人または複数の一致するユーザーがいるとエラーになります)、Single を使用します。
return UserList.Single(x => x.Type == (int)UserType.SuperUser).Id;
(一致するユーザーが 1 人もいない場合、これは例外をスローすることに注意してください。代わりに、SingleOrDefault を使用してから null をテストすることもできます。)
1つ以上あると予想され、最初のものだけを返したい場合:
return UserList.First(x => x.Type == (int)UserType.SuperUser).Id;
(一致するユーザーが 1 人もいない場合、これは例外をスローすることに注意してください。代わりに、FirstOrDefault を使用してから null をテストすることもできます。)
1 つ以上あることが予想され、一致するすべてのユーザーのすべての Id の配列を返したい場合:
return UserList.Where(x => x.Type == (int)UserType.SuperUser).Select(u => u.Id).ToArray();
すでに投稿された素敵な回答に追加するだけです。
Sam Holloways の回答の最後のコード サンプルを x を直接使用しているように見せるには、それを SQL のような構文に書き直すことができます (それが何と呼ばれるか覚えていないでください)。
IEnumerable<int> userIds = from x in UserList
where x.Type == UserType.SuperUser
select x.Id;
userIds で count メソッドを使用して、条件を満たす人がいるかどうかを判断できます。
あなたはIDを返しているので、IDはintであり、とにかく何かを返す必要があると思います.0がなければ0を返すと思います:
return UserList.Where(x => x.Type == UserType.SuperUser).Select(x => x.Id).FirstOrDefault();