gpt4 book ai didi

c# - 按 3 列中的 2 列分组

转载 作者:行者123 更新时间:2023-11-30 18:18:44 24 4
gpt4 key购买 nike

在 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() 可以吗?

我认为单独的 IEnumerable.GroupBy() 调用无法解决您的问题。

来自 LINQ GroupBy documentation :

The GroupBy(IEnumerable, Func) method returns a collection of IGrouping objects, one for each distinct key that was encountered.

可以选择输入数据的方式,使某些条目最终必须在多个组中结束。此乘法不能发生在 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 中所做的那样,接受生成多个键的选择器函数,以及将项目添加到所有组的查找创建器。更多工作,但您最终会得到更漂亮的 API。

关于c# - 按 3 列中的 2 列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40687409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com