簡體   English   中英

在linq中找到兩個列表的交集?

[英]Find the intersection of two lists in linq?

我有 int A、B 的列表。 我喜歡在 linq 中執行以下步驟

list<int> c = new List<int>();

for (int i = 0; i < a.count; i++)
{
    for (int j = 0; j < b.count; j++)
    {
        if (a[i] == b[j])
        {
            c.add(a[i]);
        }
    }
}

如果它的 a 和 b 是object ,我需要像這種方式檢查特定的屬性並添加列表,如果它等於我如何在 linq 中做到這一點?

您可以使用Intersect方法:

var c = a.Intersect(b);

這將返回 a 和 b 中的所有值。 但是,不考慮項目在列表中的位置。

您可以使用相交

var a = new List<int>();
var b = new List<int>();

var c = a.Intersect(b);

生成一個列表c其中包含列表ab中存在的所有元素:

List<int> c = a.Intersect(b).ToList();

與您的代碼等效的 LINQ 是:

var c = from i in Enumerable.Range(0, a.Count)
        from j in Enumerable.Range(0, b.Count)
        where a[i] == b[j]
        select a[i];

var cList = c.ToList();

但這樣做要好得多:

var c = from aItem in a 
        join bItem in b on aItem equals bItem
        select aItem;

var cList = c.ToList();

但這不會過濾重復項。 完全過濾重復項,您可以執行以下操作:

var cList = a.Intersect(b).ToList();

如果您希望重復項在b次數與它們一樣多,例如:

var aSet = new HashSet<int>(a);
var cList = b.Where(aSet.Contains)
             .ToList(); 

這是我的交集版本:

var a = new List<int>();
var b = new List<int>();

// intersection
var c = a.Where(x => b.Any(y => x == y)).ToList();

正如 Chris 在他對原始問題的評論中提到的,提供的示例代碼將返回列表 c 中的重復項(有關詳細信息,請參閱他的評論)。 相交只會返回不同的值。 要復制原始示例代碼的行為,請嘗試以下操作:

var c = (from value in a
         where b.Contains(a)
         select a);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM