【C#】LINQで「NOT IN」クエリを実現する方法|Except演算子の使い方を徹底解説
Except演算子とは
C#のLINQにおける Except 演算子は、IEnumerable<T> インターフェースをサポートするデータソースに対して使用できる集合演算のひとつです。すべてのLINQクエリ式、およびほとんどのLINQメソッドは IEnumerable<T> を返すため、この演算子を使えばLINQクエリの結果同士で差集合(差分)の計算を簡単に行えます。
Except 演算子は「1つ目のリストに含まれる項目から、2つ目のリストに含まれる項目を除外した結果」を返します。SQLでいうところの「NOT IN」とまったく同じ働きをするので、覚えておくと非常に便利です。
例1:Exceptメソッドを使う基本的な方法
class Program{
static void Main(string[] args){
var listA = Enumerable.Range(1, 6);
var listB = new List<int> { 3, 4 };
var listC = listA.Except(listB);
foreach (var item in listC){
Console.WriteLine(item);
}
Console.ReadLine();
}
}
上記の例では2つのリストを用意し、リストAの中からリストBに存在しない要素だけを取得しています。
実行結果
1 2 5 6
例2:SQL風のクエリ構文を使う方法
クエリ構文(SQLライクな記法)でも同じ結果が得られます。Any メソッドと否定演算子 ! を組み合わせるのがポイントです。
static void Main(string[] args){
var listA = Enumerable.Range(1, 6);
var listB = new List<int> { 3, 4 };
var listC = from c in listA
where !listB.Any(o => o == c)
select c;
foreach (var item in listC){
Console.WriteLine(item);
}
Console.ReadLine();
}
実行結果
1 2 5 6
補足:パフォーマンスと注意点
Except メソッドは内部でハッシュセットを利用するため、要素数の多いコレクションでは例2の Any を使う方法よりも高速に動作します。大規模データを扱う場合は Except の利用を推奨します。
また、Except は既定の等値比較子(EqualityComparer<T>.Default)を使用します。独自に定義したクラスのコレクションを比較したい場合は、IEqualityComparer<T> を実装して第二引数として渡すことで、意図した通りの比較が可能になります。
さらに注意したいのは、Except が遅延実行(Deferred Execution)であるという点です。クエリは実際に foreach などで列挙されるタイミングまで評価されないため、元のリストを後から変更すると結果に影響することもあります。
-
VPNでBitTorrentを匿名・安全に使う方法|公式クライアントとVuzeの設定手順
プライバシー保護は今、大きな関心を集めているテーマです。個人のデータを奪い、最高額を提示した業者に売り渡そうとする動きが後を絶たない昨今、私たち消費者にできる最善の対策のひとつは、手元にあるシンプルなツールを活用してデジタル上の足跡を隠すことです。 しかし、ウェブブラウジングにVPNを使っていても、それが自動的にBitTorrentでのファイルダウンロードにも適用されるわけではありません。そこで本記事では、BitTorrentクライアントの通信をVPN経由に限定することで、トレントを匿名で利用できるようにする方法を、公式BitTorrentクライアントとVuzeの2つに焦点を当てて解説します
-
GmailをMicrosoft Outlookで使う方法|IMAP設定とアカウント追加の手順
パソコンを使っている方なら、Yahoo!メール、Gmail、Hotmail、Outlook.comなど、複数のメールアドレスを持っていることも少なくないでしょう。時間が経つにつれて使わなくなったアドレスが出てくるのは自然なことですが、よく使うメールアドレスはOutlookの受信トレイに一元化しておくのがおすすめです。Microsoft Outlookには任意のメールアドレスを登録できますが、特に相性が良いのがGmailです。Gmailは他の多くのメールサービスよりも大容量のストレージを備え、スパム対策も強力です。さらにGoogle独自のクラウドサーバーで運用されているため、MS Outlook