LINQ を使って差集合を取得する
Microsoft Visual Studio プログラムマネージャのNoah Coad 氏のブログで面白い投稿を見つけた。
差集合取得操作をしたいと思うことが時々あるでしょう。つまり、集合 A の要素の中で集合 B に存在しないものだけを取得するという操作です。集合 A と B の型が同じであれば LINQ の Except メソッドでこれを実現できるのですが、集合の型が異なり、かつ ID をマッチさせなければならないということがよくあります。ここでは LINQ を使ってどうやってこれを実現するかという簡単な例をご紹介します。
Wolfram MathWorld によれば操作はこのように定義されます:
private static void Main(string[] args)
{
List<string> names = new List<string> { "Noah", "Sarah", "Josiah", "Craig", "Carolin" };
Dictionary<string, string> visiting = new Dictionary<string, string>() { { "Noah", "Turkey" }, { "Craig", "Germany" }, { "Sue", "Bangalore" } };
var minus =
from n in names
let places = from p in visiting select p.Key
where !places.Contains(n)
select n;
foreach (var v in minus)
{
Console.WriteLine(v);
}
Console.ReadKey();
}
実行結果は
また、LINQ をドット表記するとこうなります。
var minus = names.Where(a => !visiting.Select(b => b.Key).Contains(a));
LINQ に慣れ親しんでいればこれは些細なことだと思うのですが、この記事を書いた時点では Bing や Google で型の異なる2つの集合の差を LINQ で求める方法についてまともな情報が見当たりませんでした。今後はきっとこの記事が有益な情報源となることでしょう。もっと効率のよい方法をご存知でしたら、ぜひこの投稿にコメントしてください。
ちなみに、これを書いている時点では、Justin Van Patten という方から1件だけコメントされていた。
var minus = names.Except(visiting.Select(p => p.Key));
Comments
Post a Comment