我正在尝试构建一个LINQ查询,该查询将获取元素列表,并根据列表中元素之间的比较,选择满足特定条件的元素。像这样:
var subset = set.SomeLinqQuery((e1,e2) => e1 == e2);
subset
现在包含e1
set
的所有e1 == e2
{{1}}。有任何想法吗?我原本以为只有一个嵌套循环,但我意识到必须有一种方法可以在LINQ中进行。
答案 0 :(得分:4)
您需要一种方法来生成原始集中的唯一项。这是我的实现:
/// <summary>
/// Returns an enumeration of tuples containing all unique pairs of distinct
/// elements from the source collection. For example, the input sequence
/// { 1, 2, 3 } yields the pairs [1,2], [1,3] and [2,3] only.
/// </summary>
public static IEnumerable<Tuple<T, T>> UniquePairs<T>(this IEnumerable<T> source)
{
if (source == null)
throw new ArgumentNullException("source");
return uniquePairsIterator(source);
}
private static IEnumerable<Tuple<T, T>> uniquePairsIterator<T>(IEnumerable<T> source)
{
// Make sure that 'source' is evaluated only once
IList<T> arr = source as IList<T> ?? source.ToList();
for (int i = 0; i < arr.Count - 1; i++)
for (int j = i + 1; j < arr.Count; j++)
yield return new Tuple<T, T>(arr[i], arr[j]);
}
现在您可以轻松实现您想要的目标:
var results = set.UniquePairs()
.Where(pair => pair.Item1 == pair.Item2)
.Select(pair => pair.Item1);
答案 1 :(得分:-1)
使用交叉连接
from e1 in set
from e2 in set
where e1 == e2
select e1
这为您提供了重复项的身份联合
你可能想要更像这样的东西
from e1 in set
from e2 in set
where e1 != e2
where e1.key == e2.key
select e1