C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で2つのリストの差分を求める方法|Exceptメソッドの使い方を解説

C#で2つのリストを扱うとき、「一方のリストにだけ存在する値(差分)」を取り出したいケースはよくあります。本記事では、LINQのExceptメソッドを使って、2つのリストの差分をシンプルに求める方法を解説します。

比較元となる2つのリストを用意する

まず、比較対象となる2つの文字列型のリストを作成します。

リスト1(8つの要素)

List<string> list1 = new List<string>();
list1.Add("P");
list1.Add("Q");
list1.Add("R");
list1.Add("S");
list1.Add("T");
list1.Add("U");
list1.Add("V");
list1.Add("W");

リスト2(4つの要素)

List<string> list2 = new List<string>();
list2.Add("T");
list2.Add("U");
list2.Add("V");
list2.Add("W");

リスト2は、リスト1の一部(T〜W)だけを格納したリストです。

Exceptメソッドで差分を取得する

2つのリストの差分を求めるには、Exceptメソッドを使用します。このメソッドは、最初のリストには存在するが、2番目のリストには存在しない要素IEnumerable<T>として返します。

ExceptはSystem.Linq名前空間で定義された拡張メソッドであるため、コードの先頭にusing System.Linq;を追加する必要があります。また、重複する要素は自動的に除外される点にも注意しましょう。

サンプルコード(全体)

ここまでの内容を組み合わせた、実行可能なサンプルコードの全体像は以下のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;

public class Demo {
    public static void Main() {
        List<string> list1 = new List<string>();
        list1.Add("P");
        list1.Add("Q");
        list1.Add("R");
        list1.Add("S");
        list1.Add("T");
        list1.Add("U");
        list1.Add("V");
        list1.Add("W");

        Console.WriteLine("First list...");
        foreach(string value in list1) {
            Console.WriteLine(value);
        }

        Console.WriteLine("Second list...");
        List<string> list2 = new List<string>();
        list2.Add("T");
        list2.Add("U");
        list2.Add("V");
        list2.Add("W");

        foreach(string value in list2) {
            Console.WriteLine(value);
        }

        Console.WriteLine("Remaining values...");
        IEnumerable<string> list3;
        list3 = list1.Except(list2);

        foreach(string value in list3) {
            Console.WriteLine(value);
        }
    }
}

実行結果

First list...
P
Q
R
S
T
U
V
W
Second list...
T
U
V
W
Remaining values...
P
Q
R
S

出力の最後にある「Remaining values...」以降に注目すると、リスト1にのみ存在するP・Q・R・Sの4つの要素が出力されていることが確認できます。

まとめ

C#で2つのリストの差分を求めるなら、LINQのExceptメソッドが最も手軽です。list1.Except(list2)と書くだけで、最初のリストにのみ存在する要素を1行で取得できます。逆に、リスト2側にのみ存在する要素を知りたい場合は、list2.Except(list1)のように引数の順序を入れ替えるだけで対応可能です。

  1. Pythonで連結リストを使って2つの多項式を加算するプログラムの作り方

    問題の概要 この記事では、連結リストで表現された2つの多項式を加算するPythonプログラムを紹介します。 2つの多項式が与えられ、それらの和を求めることを考えます。多項式は連結リストとして表現し、多項式の各項は連結リストの1つのノードに対応させます。各ノードには「係数」「次数(べき指数)」、そして「次のノードへの参照(ポインタ)」を持たせます。最終的なゴールは、2つの多項式の和を表す新しい連結リストを返すことです。 たとえば、入力が以下の画像のような2つの多項式だった場合を見てみましょう。 1x^1 + 1x^2 = 0 と 2x^1 + 3x^0 = 0 この場合、出力は次のようになりま

  2. 【Python】2つのリスト間の欠落している値と追加されている値を見つける方法

    集合論において、ある集合Aの「補集合」とは、Aに含まれない要素を指します。また、集合Bに対するAの「相対補集合」は、集合AとBの「差(difference)」とも呼ばれます。本記事では、この原理を応用し、Pythonで2つのリストを比較することで、互いに欠落している要素と余分な要素を効率よく見つける方法を解説します。Pythonのset型には差分を求めるためのdifference()メソッドが標準で用意されており、これを使うと非常にシンプルに実装できます。 アルゴリズム ユーザー入力から2つのリストAとBを作成します。 AとBをそれぞれセット(set型)に変換します。 1つ目のリストに欠落し