在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
由于三分之二匹配,它会将它们组合在一起,即使最后一个拼写错误或丢失。
答案 0 :(得分:1)
我认为单独一个IEnumerable.GroupBy()
电话无法解决您的问题。
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进行调试