こんにちは。エクセルソフトの田淵です。
先日、以下のエントリーで色々なやり方を教えてもらいました。ありがとうございます。
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 の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。
以上です。