在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
由于三分之二匹配,它会将它们组合在一起,即使最后一个拼写错误或丢失。
我不认为单独一个IEnumerable.GroupBy()
电话可以解决你的问题。
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。
我使用计算列在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进行分组