0

linq を使用して次のように検索する一般的なリストがあります。

NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault();
itemList.Where(elm => elm.UID == UID).SingleOrDefault().Read = true;

次に、 の値を使用して WCF Web サービスを呼び出しますitem。これは、SingleOrDefault() がオブジェクトのコピーを含む新しい IEnumerable を返すことを理解しているためです。(誤解でしたか?) 通常、リストはそれほど長くないため、余分な反復はそれほど重要ではありませんが、本当に気になります。

2 つの反復を統合する方法が思い浮かびません。何か案は?

4

3 に答える 3

4

SingleOrDefaultIEnumerableを返すのではなく、代わりに単一のアイテムを返します。すでに変数に割り当てて保持しているので、itemそれをさらに処理するために使用してみませんか?

NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault();
item.Read = true;

これをさらに単純化できます。そして、Timが指摘したように、nullチェックが必要です(理由は以下を参照)。

NotificationWindowItem item = itemList.SingleOrDefault(elm => elm.UID == UID);
if (item == null)
{
    // ... some alternative or error handling code
}
else
{
    item.Read = true;
}

質問/不明確さを拡張するには:

  1. itemListはアイテムのリストです。各アイテムはNotificationWindowItemです。リストはIEnumerableインターフェイスを実装します。(より正確には、itemListはList<NotificationWindowItem>を実装するものであると想定していますIEnumerable<NotificationWindowItem>
  2. を取り、一致する要素のみを含むIEnumerable<NotificationWindowItem>別のメソッドを作成する拡張メソッドはどこにありますか。IEnumerable<NotificationWindowItem>
  3. SingleOrDefaultは、を受け取りIEnumerable<NotificationWindowItem>、通常の単純な単一のNotificationWindowItemを返します。(それ以上に、一致する要素が1つしかないことを確認します。一致する要素が複数ある場合は例外がスローされます。一致する要素がない場合は、default(T)どちらが返さnullれますか)。
  4. itemではありませIEnumerable。ですNotificationWindowItem。背後に魔法はありません。シンプルなオブジェです。LINQとは何の関係もありません。LINQを使用して取得しただけですが、その後、NotificationWindowItemの他のインスタンスで実行できることは何でも実行できます。
于 2012-07-11T13:34:57.287 に答える
1

これを行うだけで、二重ループは必要ありません。

var item = itemList.SingleOrDefault(elm => elm.UID == UID);
item.Read = true;
于 2012-07-11T13:37:12.883 に答える
0

あなたはこれを使うことができます、

NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault().toList(); 

あなたの問題を解決するために。

于 2012-07-11T14:23:36.313 に答える