2

まず、LINQをいじり始めたばかりで、よくわかりません。

とにかく、私がやろうとしているのは、LINQと.Whereステートメントを使用してリストに追加することです。

これは私が試したことです:

List<object> FirstList = new List<object>();
List<object> SecondList = new List<object>();
Listener.Clients.Where(x => (x.Value.Authenticated) ? FirstList.Add(x.Value.UserID) : SecondList.Add(x.Value.UserID));

Listenerはソケットラッパークラスであり、ClientsはクラスClientの配列です。

そのClientクラスには、必要な値がいくつかあります。そのクライアントが認証されている(ログインしている)かどうかを確認し、認証されている場合は最初のリストに追加し、認証されていない場合は2番目のリストに追加します。リスト、ただし、?:演算子には戻り値が必要なようですが、リストに追加しても何も返されません。

私はそれが良いことを説明したと思います。私は言葉が上手ではありません。

4

3 に答える 3

6

IEnumerable.Where特定の基準に一致するリストの要素を単にフィルタリングすることを意味します。Where句内で操作しようとしていますが、これは正しくありません。

私はあなたが次のようなものが欲しいと思います:

var firstList = 
    Listener
        .Clients
        .Where(c => c.Value.Authenticated).Select(c => c.Value.UserID).ToList();
var secondList = 
    Listener
        .Clients
        .Where(c => !c.Value.Authenticated).Select(c => c.Value.UserID).ToList();
于 2012-10-08T20:28:04.160 に答える
3

1つの列挙で2つ(またはそれ以上)のリストを作成しようとしています。ToLookup代わりに使用することを検討してください。

ILookup<bool, Client> lookup = source.ToLookup(c => c.Value.Authenticated);
List<Client> firstList = lookup[true].ToList();
List<Client> secondList = lookup[false].ToList();

不明なキーがルックアップに送信されると、空のコレクションが返されます。


クライアントの代わりにUserIdが必要なので、値を選択するToLookupのオーバーロードを使用します。

ILookup<bool, string> lookup = source
  .ToLookup(c => c.Value.Authenticated, c => c.Value.UserId);
List<string> firstList = lookup[true].ToList();
List<string> secondList = lookup[false].ToList();
于 2012-10-08T20:41:11.177 に答える
0

このIEnumerable.Whereexensionメソッドは、フィルタリングされた要素のリストを取得することを目的としており、要素のタイプを受け取り、ブール値を返す必要がある匿名メソッドをパラメーターとして受け取ります。

于 2012-10-08T20:31:17.750 に答える