端くれプログラマの備忘録 C# [C#] リストから別のリストの内容を取り除く

[C#] リストから別のリストの内容を取り除く

例えば会員名簿と退会会員名簿がテキストファイルに保存されていて、前者から後者を除外して有効会員名簿を作成するとしよう。それぞれの名簿を文字列リストに読み込んでどう処理するか考察してみたい。ここでは処理時間に関しては議論しない。

手っ取り早いのはRemoveメソッドを使って、リスト中で最初に見つかった要素を削除する方法だろうか。

List<string> members = new List<string>();
// Reads file into members.
 
List<string> obsoletes = new List<string>();
// Read file into obsoletes.
 
foreach (string name in obsoletes) {
    members.Remove(name); // remove name if members includes
}
// Saves members to file.

この方法だと、もし会員名簿に重複して会員が登録されている場合(それが許される場合)、最初の登録しか削除されない。もし名簿が重複を許すことが明らかな場合(そういう仕様ならば)、ぞれぞれのリストから事前に重複要素を削除してから、2つのリストをぶつければ良いだろう。重複要素を削除するにはDistinctメソッドが使える。

List<string> members = new List<string>();
// Reads file into members
IEnumerable<string> distinctMembers = members.Distinct();
// or
var uniqueMembers = members.Distinct().ToList();

参考サイト

Enumerable.Distinct(TSource) メソッド (IEnumerable(TSource)) (System.Linq)
http://msdn.microsoft.com/ja-jp/library/bb348436(v=vs.110).aspx