按3列中的2列分组

时间:2016-11-18 23:19:38

标签: c# .net linq group-by

在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

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

2 个答案:

答案 0 :(得分:1)

IEnumerable.GroupBy()会吗?

我认为单独一个IEnumerable.GroupBy()电话无法解决您的问题。

来自LINQ GroupBy documentation

  

GroupBy(IEnumerable,Func)   method返回一个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

你能用什么?

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

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

答案 1 :(得分:-1)

我通过使用计算列在oracleSql中解决了。所以对于我来说,第一个变量还可以 但是第二列和第三列可以在一个或另一个中。 所以我做了什么,我使用了case函数,如果第2列不为null,则值为:column 2,如果null值为:Column 3。 所以我想在您的情况下,尝试找到大小写函数的等效项,或者 您可以生成2个计算列。

第1列为空,var 1 =第2列,var 2 =第3列

第2列为空,var 1 =第1列,var 2 =第3列

第3列为空,var 1 =第1列,var2 =第3列

然后您可以通过var1和var2进行调试