按3列中的2列分组

问题描述 投票:3回答:2

在C#中使用LINQ,您可以对列/属性进行分组,如下所示:

group x by new { x.Column1, x.Column2, x.Column3 }

如果我想将项目与3个属性中的2个匹配,该怎么办?有没有办法用LINQ做到这一点?

结果分组看起来如下:

            Address          Zip         Id
Group 1      null           70002        78
Group 1      Main St        null         78
Group 1      Main St        70002       null

Group 2      Town Ln        null         15
Group 2      null           70006        15
Group 2      Town Ln        70006       null

由于三分之二匹配,它会将它们组合在一起,即使最后一个拼写错误或丢失。

c# .net linq group-by
2个回答
1
投票

IEnumerable.GroupBy()会吗?

我不认为单独一个IEnumerable.GroupBy()电话可以解决你的问题。

来自LINQ GroupBy documentation

GroupBy(IEnumerable,Func)方法返回一组IGrouping对象,每个对象遇到一个不同的密钥。

可以选择输入数据,使得某些条目必须最终在结果中的多个组中结束。这种乘法不会发生在current GroupBy implementation

 internal static Lookup<TKey, TElement> Create<TSource>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer) {
        if (source == null) throw Error.ArgumentNull("source");
        if (keySelector == null) throw Error.ArgumentNull("keySelector");
        if (elementSelector == null) throw Error.ArgumentNull("elementSelector");
        Lookup<TKey, TElement> lookup = new Lookup<TKey, TElement>(comparer);
        foreach (TSource item in source) {
            lookup.GetGrouping(keySelector(item), true).Add(elementSelector(item));
        }
        return lookup;
    }

此类输入的示例:

Id1 Zip1 Street1
Id1 Zip1 Street2
Id1 Zip2 Street1

这个3项目集必须分组到一个包含总共4个项目的集合:

Group 1: Id1 Zip1 Street1
Group 1: Id1 Zip1 Street2
Group 2: Id1 Zip1 Street1
Group 2: Id1 Zip2 Street1

你能用什么?

从3个特定属性中匹配任意2个特定情况显然可以通过合并单独的密钥GroupBys,删除重复项和已包含在较大集合中的单个行来解决。不过,不是单线程。

您也可以实现自己的GroupBy函数,类似于在BCL中完成的操作,接受生成多个键的选择器函数,以及向所有组添加项目的Lookup创建器。更多的工作,但你最终得到更漂亮的API。


-1
投票

我使用计算列在oracleSql中解决了。所以对于我的情况,第一个变量是好的。但是第二列和第三列可以是一个或另一个。所以我做了什么,我使用了case函数,如果第2列不为null,那么value是:第2列,如果null值是:第3列。所以我想,在你的情况下,尝试找到case函数的等价物或者是,和你可以生成2个计算列。

case列1为null,var 1 = column2,var 2 = column 3

case列2为null,var 1 = column1,var 2 = column 3

case column 3为null,var 1 = column 1,var2 = column 3

然后你可以按var1和var2进行分组

© www.soinside.com 2019 - 2024. All rights reserved.