C#であるリストに存在しない要素を別のリストから抽出する方法
LINQのExcept演算子は、LINQにおける「セット演算子(Set Operators)」カテゴリに分類される演算子です。
Except()メソッドは2つのコレクションを引数として受け取り、最初のコレクションの中から、2番目のコレクションに存在しない要素を抽出します。
ただし注意点があります。Except拡張メソッドは、クラスのような複合型(参照型)のコレクションに対しては、既定では参照の等価性で比較を行うため、期待どおりの結果を返さないことがあります。複合型を扱う場合は、後半で紹介するWhere句を使った方法が有効です。
Except()メソッドを使用した例
まずは、文字列のリストをExcept()で比較する基本的な例です。
using System;
using System.Collections.Generic;
using System.Linq;
namespace DemoApplication {
class Program {
static void Main(string[] args) {
List<string> animalsList1 = new List<string> {
"tiger", "lion", "dog"
};
Console.WriteLine($"List1の値:");
foreach (var val in animalsList1) {
Console.WriteLine($"{val}");
}
List<string> animalsList2 = new List<string> {
"tiger", "cat", "deer"
};
Console.WriteLine($"List2の値:");
foreach (var val in animalsList2) {
Console.WriteLine($"{val}");
}
var animalsList3 = animalsList1.Except(animalsList2);
Console.WriteLine($"List1のうちList2に存在しない値:");
foreach (var val in animalsList3) {
Console.WriteLine($"{val}");
}
Console.ReadLine();
}
}
}
出力結果
上記コードの実行結果は以下のとおりです。
List1の値: tiger lion dog List2の値: tiger cat deer List1のうちList2に存在しない値: lion dog
このように、Except()を使えば「List1には存在するが、List2には存在しない要素」を簡単に取得できます。
Where句を使用した例(複合型の場合)
次に、独自クラス(複合型)のオブジェクトを格納したリストを比較する例です。Except()が正しく機能しないケースでは、Where句とAllメソッドを組み合わせて、特定のプロパティ(ここではName)をもとに差分を抽出します。
using System;
using System.Collections.Generic;
using System.Linq;
namespace DemoApplication {
class Program {
static void Main(string[] args) {
List<Fruit> fruitsList1 = new List<Fruit> {
new Fruit {
Name = "Apple",
Size = "Small"
},
new Fruit {
Name = "Orange",
Size = "Small"
}
};
Console.WriteLine($"List1の値:");
foreach (var val in fruitsList1) {
Console.WriteLine($"{val.Name}");
}
List<Fruit> fruitsList2 = new List<Fruit> {
new Fruit {
Name = "Apple",
Size = "Small"
},
new Fruit {
Name = "Mango",
Size = "Small"
}
};
Console.WriteLine($"List2の値:");
foreach (var val in fruitsList2) {
Console.WriteLine($"{val.Name}");
}
var fruitsList3 = fruitsList1.Where(f1 => fruitsList2.All(f2 => f2.Name != f1.Name));
Console.WriteLine($"List1のうちList2に存在しない値:");
foreach (var val in fruitsList3) {
Console.WriteLine($"{val.Name}");
}
Console.ReadLine();
}
}
public class Fruit {
public string Name { get; set; }
public string Size { get; set; }
}
}
出力結果
上記コードの実行結果は以下のとおりです。
List1の値: Apple Orange List2の値: Apple Mango List1のうちList2に存在しない値: Orange
補足:IEqualityComparerを使う方法
複合型でもExcept()を使いたい場合は、IEqualityComparer<T>を実装した比較クラスを作成し、Except(第2コレクション, 比較子)の形式で渡すことでも対応可能です。プロパティ同士を直接比較したいだけであれば、本記事のようにWhere句を使う方法がシンプルで分かりやすいでしょう。
-
【保存版】PowerPointプレゼンテーション同士をリンクしてシームレスに切り替える方法
プレゼンテーションから別のプレゼンテーションへ切り替える際に長い間が空いてしまうと、せっかくのプレゼン全体の印象が台無しになりかねません。あらかじめ2つのプレゼンテーションをリンクしておけば、貴重な時間を節約できるだけでなく、切り替えもスムーズに行えます。この記事では、Microsoft Office PowerPointであるプレゼンテーションを別のプレゼンテーションにリンクする方法を、手順を追って詳しく解説します。PowerPointプレゼンテーション同士をリンクする基本手順本番で慌てないためには、事前準備が何よりも大切です。プレゼンテーションをリンクする前に、まず両方のプレゼンテーション
-
Gmailの連絡先を別のアカウントへ移行・転送する方法【PC・Android対応】
Googleメールは個人情報を自動的にオンラインでバックアップしてくれるため、Gmailの連絡先を一つずつ手作業で保存する必要はもうありません。この記事では、古いアカウントから新しいアカウントへGmailの連絡先を移行する手順を、PCとAndroidそれぞれの場合に分けてわかりやすく解説します。パソコン(PC)を使う方法1. ブラウザで contacts.google.com にアクセスし、Googleアカウントにログインします。2. ページを下までスクロールすると「その他(More)」という項目が表示されます。3. ドロップダウンメニューの中に「エクスポート(Export)」オプションがあり