从IEnumerable中选择相同类型的唯一/不同值组合

Ind*_*igo 2 .net c# linq ienumerable

我有三个相同类型的IEnumebles(字符串),我想从中获得唯一的值组合.不太清楚如何在这里实现LINQ.

输入数据看起来像这样,一列代表一个IEnum

通过添加 - 作为分隔符,结果应该是这样的列表

ap-1
bq-4
br-7
cs-8
cs-9
dt-10
eu-11

数据本身具有独特的联系.一个帐户中的所有项目都是唯一的,特定项目的所有子项目也是如此.

Dou*_*las 5

您不应该将相关项目存储在单独的序列中; 这是一个反模式.但是,如果这恰好是您的数据可用的方式,您可以先使用序列组合序列中的项目Zip,然后使用它们Distinct来获取唯一值.

var result = accounts.Zip(projects, (a, p) => a + "-" + p)
                     .Zip(subprojects, (a, s) => a + "-" + s)
                     .Distinct()
                     .ToList();
Run Code Online (Sandbox Code Playgroud)

编辑:根据Servy的回答,这里是一个用于压缩任意数量的序列的扩展方法:

public static partial class EnumerableExtensions
{
    public static IEnumerable<TResult> Zip<TSource, TResult>(
        this IEnumerable<IEnumerable<TSource>> sequences,
        Func<IEnumerable<TSource>, TResult> resultSelector)
    {
        var enumerators = sequences.Select(sequence => sequence.GetEnumerator()).ToArray();
        while (enumerators.All(enumerator => enumerator.MoveNext()))
            yield return resultSelector(enumerators.Select(enumerator => enumerator.Current));
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是它的消费方式:

string[][] sequences = { accounts, projects, subprojects };
var results = sequences.Zip(items => string.Join("-", items))
                        .Distinct()
                        .ToList();
Run Code Online (Sandbox Code Playgroud)