C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Whereのフィルタ条件にListを使いたい

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■87637 / inTopicNo.1)  Whereのフィルタ条件にListを使いたい
  
□投稿者/ ちゅん (4回)-(2018/06/15(Fri) 11:31:07)

分類:[C#] 

2018/06/15(Fri) 11:32:44 編集(投稿者)
2018/06/15(Fri) 11:32:40 編集(投稿者)

いつもお世話になっております。
VS 2010です。

現在、多数のアイテムを保持している変数から、特定のフィルタ条件に合致したアイテムを抽出するメソッドがあります。
public class EntitiesItem
{
public string Layer { get; set; }
public string Name { get; set; }
}
private Dictionary<string, EntitiesItem> Items;
public List<EntitiesItem> GetItems(string layer)
{
var list =
this.Items.Values.Where(_ =>
(_.Layer == layer || filter.Layer == null)
).ToList();
return list;
}
これを改変して、フィルタ条件layerをListにして、何れかに一致したら抽出対象とします。
public List<EntitiesItem> GetItems(List<string> layer)

また、さらにもう一つListを追加して、2つのList両方に一致したら抽出対象とします。
public List<EntitiesItem> GetItems(List<string> layer, List<string> name)

どのように書いたら良いのでしょうか。

以上、よろしくお願いいたします。
引用返信 編集キー/
■87640 / inTopicNo.2)  Re[1]: Whereのフィルタ条件にListを使いたい
□投稿者/ 魔界の仮面弁士 (1713回)-(2018/06/15(Fri) 12:07:19)
No87637 (ちゅん さん) に返信
> 2つのList両方に一致したら抽出対象とします。
> public List<EntitiesItem> GetItems(List<string> layer, List<string> name)

試していませんが、
 return this.Items.Values
  .Where(x => layer.Any(y => y == x.Layer))
  .Where(x => name.Any(y => y == x.Name ))
  .ToLiost();
あるいは、
 return this.Items.Values.Where(x
  => layer.Any(y => y == x.Layer)
  && name.Any(y => y == x.Name)
 ).ToLiost();
などと書けないでしょうか。
引用返信 編集キー/
■87645 / inTopicNo.3)  Re[2]: Whereのフィルタ条件にListを使いたい
□投稿者/ ちゅん (5回)-(2018/06/15(Fri) 15:16:31)
なるほど!Anyというものを初めて知りました。

頂いたコードで出来そうでしたが、ひとつ説明不足でした申し訳ございません。

>また、さらにもう一つListを追加して、2つのList両方に一致したら抽出対象とします。
>public List<EntitiesItem> GetItems(List<string> layer, List<string> name)
と書きましたが、Listがnullの時は常にtrueとしたいのです。

ストレートに下記のように書いてみたした。
return this.Items.Values
.Where(x =>
(layer.Any(y => y == x.Layer) || layer == null) &&
(name.Any(y => y == x.Name) || name == null)
).ToList();
しかしlayerやnameがnullだとエラーが出てしまいます。

事前にifで分岐するしかないのでしょうか?
そうすると3パターン書かないといけませんが、実際には条件式がもっと複雑になるため3パターンではすまないので何とかする方法が御座いましたらよろしくお願いいたします。


引用返信 編集キー/
■87646 / inTopicNo.4)  Re[3]: Whereのフィルタ条件にListを使いたい
□投稿者/ せば (2回)-(2018/06/15(Fri) 15:36:05)
> しかしlayerやnameがnullだとエラーが出てしまいます。

https://msdn.microsoft.com/ja-jp/library/6373h346(v=vs.120).aspx
ご参考下さい。
引用返信 編集キー/
■87647 / inTopicNo.5)  Re[4]: Whereのフィルタ条件にListを使いたい
□投稿者/ ちゅん (6回)-(2018/06/15(Fri) 15:51:55)
せば 様
回答ありがとうございます。

nullの判定を左に持ってくれば良いのですね。
今日は試す暇がないので明日改めて確認します。

引用返信 編集キー/
■87661 / inTopicNo.6)  Re[5]: Whereのフィルタ条件にListを使いたい
□投稿者/ ちゅん (7回)-(2018/06/16(Sat) 10:33:34)
無事動くようになりました!
本当にありがとうございました。
解決済み
引用返信 編集キー/
■87662 / inTopicNo.7)  Re[6]: Whereのフィルタ条件にListを使いたい
□投稿者/ Azulean (956回)-(2018/06/16(Sat) 20:32:04)
蛇足ですが、比較する量が多くなると Any での検索は遅くなっていきます。
その場合は HashSet<T> を使うことも検討しましょう。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ