-1

ifブロックで「x」変数を使用するにはどうすればよいですか? ステートメントがtrueの場合、xのIdフィールドを返したいです。

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

3 に答える 3

5

ラムダ式の外で「LINQ 変数」にアクセスすることはできません。

やりたいことは、条件を満たすId要素のプロパティを取得することです。xx.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条件を満たすすべての要素の値を取得する場合は、拡張メソッドWhereSelect拡張メソッドを使用します。

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

Where(x => condition(x))「通常の」リストを取得したい場合は、 の前IEnumerableに追加して、条件を満たすすべての要素を含む を返します。ToList();

于 2013-02-05T11:09:58.373 に答える
1

予想される一致数: つまり、リスト内の何人のユーザーが 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();
于 2013-02-05T11:14:19.073 に答える
0

すでに投稿された素敵な回答に追加するだけです。

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();
于 2013-02-05T11:47:14.653 に答える