gpt4 book ai didi

C# LINQ - 按属性对列表进行分组,然后按不同的组进行选择

转载 作者:行者123 更新时间:2023-12-04 00:49:00 25 4
gpt4 key购买 nike

我有一个列表,我想按属性 A 进行分组。然后选择 GroupBy 键为 null'' 的该组的所有元素,然后我想返回这些组的所有元素。否则,对于组键,返回该组的第一个元素。我想出了以下内容以及我对代码的期望。任何帮助将不胜感激。

示例代码:

public class ABC
{
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
}

var list = new List<ABC>()
{
new ABC() { A = "a", B = "b", C = "c" },
new ABC() { A = "a", B = "b", C = "c" },
new ABC() { A = null, B = "b", C = "c" },
new ABC() { A = null, B = "b", C = "c" },
new ABC() { A = "", B = "b", C = "c" },
new ABC() { A = "", B = "b", C = "c" },
};

var result = list.GroupBy(x => x.A)
.Select(x =>
{
if (!string.IsNullOrEmpty(x.Key))
return x.First();
else
return x;
})
.ToList();

我的期望:

我希望从结果中看到总计 5

{ A = "a", B = "b", C = "c" } count 1 (1 removed)
{ A = null, B = "b", C = "c" } count 2 (none removed)
{ A = "", B = "b", C = "c" } count 2 (none removed)

最佳答案

像这样:

 var result = list
.GroupBy(item => item.A)
.SelectMany(group => string.IsNullOrEmpty(group.Key)
? group as IEnumerable<ABC>
: new ABC[] {group.First()})
.ToList();

这里的技巧是我们应该返回集合:整个组或仅包含First 项的集合(数组)。

您可以摆脱分组扁平化以获得更快的版本,但是,它利用了副作用:

 HashSet<string> uniqueA = new HashSet<string>(); 

var result = list
.Where(item => string.IsNullOrEmpty(item.A) || uniqueA.Add(item.A))
.ToList();

关于C# LINQ - 按属性对列表进行分组,然后按不同的组进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68088232/

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