通过在LINQ中将它们相互比较来选择元素的子集

时间:2011-02-26 20:47:06

标签: c# linq

我正在尝试构建一个LINQ查询,该查询将获取元素列表,并根据列表中元素之间的比较,选择满足特定条件的元素。像这样:

var subset = set.SomeLinqQuery((e1,e2) => e1 == e2);

subset现在包含e1 set的所有e1 == e2 {{1}}。有任何想法吗?我原本以为只有一个嵌套循环,但我意识到必须有一种方法可以在LINQ中进行。

2 个答案:

答案 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