提取IEnumerable<;T>;其键值等于IEnumerable<;U>;

本文关键字:gt lt IEnumerable 提取 键值 | 更新日期: 2023-09-27 17:57:51

我想提取一个IEnumerable序列的所有项,该序列的键值等于另一个IEnumerable序列中的一个键值。请考虑第一个序列是类型"T",其中T是:

class T
{
    int SpecificValue;
    // other payload
}

第二个序列是"U"型,其中U是:

class U
{
    int SpecificValueOfSameType;
    // other payload (different from class T)
}

有可能吗?

作为侧节点:我使用了术语"Key"-Value,但不能保证这个值在两个序列中都是唯一的。这应该有助于更详细地解释我的需求。在实际代码中,我可以想象有某种Compare Func参数)。

提取IEnumerable<;T>;其键值等于IEnumerable<;U>;

听起来像是在寻找Join

ts.Join(us, t => t.SpecificValue, u => u.SpecificValueOfSameType, (t, u) => new Something)

试试这个:

Ts.Where(t => Us.Select(u => u.SpecificValueOfSameType).Contains(t.SpecificValue))

正如K Ivanov所示,您可以使用Contains,但如果您的收藏相当大,您最好先将它们放在HashSet中:

var keys = new HashSet<T>(us.Select(u => u.SpecificValueOfSameType));
var query = ts.Where(t => keys.Contains(t.SpecificValue));

编辑:我错过了一个事实,即在任何一个集合中都可能有重复的密钥。这对上面的代码来说很好,但对联接来说不太好(至少,如果没有Distinct调用也不行)。

"Compare Func"参数的含义并不完全清楚。如果这只是从序列中提取密钥的一种方法,那没关系。如果这是一个比较两个键相等性的函数,那就另当别论了。那就意味着你不可能是在胡说八道。

不能保证这个值在两个序列中都是唯一的。

好吧,这表明您希望远离大多数联接。

加入GroupJoin怎么样?当存在多个匹配时,这种类型的联接不会引入重复。

from t in tSource
join u in uSource
  on t.SpecificValue
  equals u.SpecificValueOfSameType
  into g
where g.Any()
select t;

也写作:

tSource.GroupJoin(uSource,
  t => t.SpecificValue,
  u => u.SpecificValueOfSameType,
  (t, g) => new {t, g})
.Where(x => x.g.Any())
.Select(x => x.t)