読者です 読者をやめる 読者になる 読者になる

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

LINQ で List などを複数の「含む」「含まない」条件でフィルタをしたい

こんにちは。エクセルソフトの田淵です。

先日、以下のエントリーで色々なやり方を教えてもらいました。ありがとうございます。

LINQ で任意の文字を含む/含まない(積集合/差集合)コレクションを作成する色々なやり方を教えていただいた - Xamarin 日本語情報

今日はもう少し複雑なコレクションから複数の条件でフィルタする方法を考えてみたいと思います。

名前と住所のコレクションから、名前に taro, jiro を「含む」、住所に tokyo, aichi を「含まない」コレクションを抜き出したい場合、

List<Person> persons = new List<Person>();
persons.Add(new Person { Name = "Taro Tokyo", Address = "Tokyo-To" }); 
persons.Add(new Person { Name = "Taro Osaka", Address = "Osaka-Fu" }); // 抜出対象
persons.Add(new Person { Name = "Taro Aichi", Address = "Aichi-Ken" });
persons.Add(new Person { Name = "Jiro Osaka", Address = "Osaka-Fu" }); // 抜出対象
persons.Add(new Person { Name = "Jiro Aichi", Address = "Aich-Ken" });
persons.Add(new Person { Name = "Saburo Aichi", Address = "Aichi-Ken" });
persons.Add(new Person { Name = "Yotaro Osaka", Address = "Osaka-Fu" }); // 抜出対象
persons.Add(new Person { Name = "Yotaro Aichi", Address = "Aichi-Ken" });

string[] filter1 = { "taro", "jiro" };
string[] filter2 = { "tokyo", "aichi" };

var res = from p in persons
          where filter1.Any(fs => p.Name.ToLower().Contains(fs))
          where filter2.All(fs => !p.Address.ToLower().Contains(fs))
          select p;

foreach (var item in res)
{
    Console.WriteLine(item.Name);
}

こういう感じしか思いつけませんでした。。

想定する抽出結果の Name は
Taro Osaka
Jiro Osaka
Yotaro Osaka です。

「含まない」場合は All にしないといけない感じですね。

教えていただいた Join は Equals でしか結合できず、Intersect は同じ構成のコレクション同士を指定しないといけないようで使えませんでした。他に良い書き方をご存じの方は教えてください。

以上です。

Xamarin 気になった方は

難しいですが大変便利な LINQ が使える Xamarin は最高ですね!

是非 ダウンロード(直接) / ダウンロード(弊社経由) して触ってみてください。 学習用リソースJXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。

以上です。