提取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参数)。
听起来像是在寻找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)