gpt4 book ai didi

c# - 在 linq 中使用不同的选择进行分组

转载 作者:行者123 更新时间:2023-11-30 19:56:26 25 4
gpt4 key购买 nike

我有以下用例:

Account Name  |  Ref 1 | Ref 2

Account1 | Mike | John
Account1 | |
Account1 | |
Account2 | Carl | Mike
Account2 | Carl | Mike

具有相同AccountName、Ref1、Ref2的行应该合并在一起,但是

if contains empty Ref1 or Ref2 should not be merged.

结果应该是:

Account Name  |  Ref 1 | Ref 2

Account1 | Mike | John
Account1 | |
Account1 | |
Account2 | Carl | Mike

AccountViewModel has properties: AccountName, Ref1, Ref2

.

var result = new List<AccountViewModel >();

source.GroupBy(vm => new { vm.AccountName, vm.Ref1, vm.Ref2})
.Select(group =>
{
if (group.All(vm => string.IsNullOrWhiteSpace(vm.Ref1)) ||
group.All(vm => string.IsNullOrWhiteSpace(vm.Ref2)))
{
result.AddRange(group);
}
else
{
result.Add(new AccountViewModel
{
AccountName = group.Key.AccountName,
Ref1= group.First().Ref1,
Ref2= group.First().Ref2
});
}
});

return result;

我是否缺少 GroupBy 的一项功能?可以用其他方式完成吗?

最佳答案

三个建议。

首先,您可以使用 SelectMany 将每个组映射到一个项目序列,然后为您将这些序列重新合并在一起,而不是使用 Select 并将其作为副作用添加到列表中。

其次,您不必检查整个组是否有空值/空格 - 您已经按这些值进行了分组,因此组中的每个项目都应该相同。您可以只检查 key 。

第三,如果您不想创建新的 AccountViewModel 来表示组 - 您可以只使用组中的第一个项目。

return source
.GroupBy(vm => new { vm.AccountName, vm.Ref1, vm.Ref2})
.SelectMany(group =>
{
if (string.IsNullOrWhiteSpace(group.Key.Ref1) ||
string.IsNullOrWhiteSpace(group.Key.Ref2))
{
// keep the group separate
return (IEnumerable<AccountViewModel>)group;
}
else
{
// just use one item
return new[] { group.First() };
}
});

关于c# - 在 linq 中使用不同的选择进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873245/

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