linq查本集合中不包含於另一個集合的元素


int[] num0 = { 28, 32, 14 };
int[] num1 = {14,15,16};

如上,我想把num0中不包含於num1的元素都找出來,其正確結果應該是28,32。早上看到原來linq可以寫多個from字句,之后就想到了這樣的寫法:

int[] num0 = { 28, 32, 14 };
int[] num1 = {14,15,16};

var qq = from n1 in num0
from n2 in num1
where n1 != n2
select n1;

結果,我錯了,調試了一下才知道自己想當然了。結果如下:

總共進行了3 * 3,9次比較,那個語句把所有成立的n1都選進去了。

所以還是老老實實用contains好了

int[] num0 = { 28, 32, 14 };
int[] num1 = { 14, 15, 16 };

var bb = from n1 in num0
where num1.Contains(n1) == false
select n1;

另外,推薦一個工具:LinqPad,我的這個例子就是用linqPad 調試的,上面那個結果顯示使用了語句:qq.Dump();

網址:http://www.linqpad.net/

下載:

      for .net 3.5:http://www.linqpad.net/GetFile.aspx?LINQPad.exe

      for .net 4.0:http://www.linqpad.net/GetFile.aspx?LINQPad4.zip
這個工具還不錯,自帶了許多例子,還可以寫入自己的語句運行。

另外,微軟官方的Official Visual Studio 2008 C# Samples里面的LINQ - Sample Queries也是不錯的,帶了許多例子,幾乎所有的linq特性都有,還可以執行。

網址:http://code.msdn.microsoft.com/csharpsamples

LINQ - Sample Queries 截圖:

 

2012年1月13日16:56:23 更新:

后來又找到了Except、Intersect、Union、Distinct等方法,終於可以排除一個集合中那些某個屬性的值存在於另一個幾個中元素屬性的方法了。

按照Example上的例子,大概可以如此實現:

public void Linq53() {
List<Product> products = GetProductList();
List<Customer> customers = GetCustomerList();

var productFirstChars =
from prod in products
select prod.ProductName[0];
var customerFirstChars =
from cust in customers
select cust.CompanyName[0];

var productOnlyFirstChars = productFirstChars.Except(customerFirstChars);

Console.WriteLine("First letters from Product names, but not from Customer names:");
foreach (var ch in productOnlyFirstChars) {
Console.WriteLine(ch);
}
}




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM