gpt4 book ai didi

c# - LINQ GroupBy 列表<>

转载 作者:行者123 更新时间:2023-11-30 21:53:06 25 4
gpt4 key购买 nike

我有一个简单的 LINQ 查询,它试图执行 GroupBy,其中语句中的一项是 List<string>.

var viewModel = reports
.GroupBy(c => new { c.Id, c.PetList })
.Select(g => new ArmReportModel
{
PetList = g.Key.PetList,
Pets = g.Count()
});

在此声明之前,我正在执行我的 EF 存储库方法,该方法最终调用一个方法来创建上面的 PetList。

如果我从 GroupBy() 中删除 PetList它按预期工作。为了按 List<string> 分组,我必须做些什么吗?类型?

最佳答案

我假设 Id是一个标识符,因此任何两个 c与相同Id实际上是相同的并且具有相同的PetList .因此我们可以 GroupBy只是 Id并得到 PetList另一种方式:

var viewModel = reports
.GroupBy(c => c.Id)
.Select(g => new ArmReportModel
{
PetList = g.First().PetList, // Might need FirstOrDefault() with some providers
Pets = g.Count()
});

除此之外,我想首先确保我可以使用 IEqualityComparer<T>GroupBy .如果供应商允许,那没问题。否则我会开始:

reports.Select(c => new {c.Id, c.PetList}).AsEnumerable()

这将从提供​​程序中检索到内存中所需的最小值,以便从那时起可以使用 linq-to-objects 提供程序。

我需要能够定义一个 IEqualityComparer<T>对于一些 T ,所以我停止使用匿名类型:

private class IdAndList
{
public int Id { get; set; }
public List<string> PetList { get; set; }
}

private class ReportIdAndPetListComparer : IEqualityComparer<IdAndList>
{
public bool Equals(IdAndList x, IdAndList y)
{
if (ReferenceEquals(x, y)) return true;
if (x == null || y == null) return false;
if (x.Id != y.Id) return false;
if (x.PetList == null) return y.PetList == null;
if (y.PetList == null) return false;
int count = x.PetList.Count;
if (y.PetList.Count != count) return false;
for (int i = 0; i != count; ++i)
if (x.PetList[i] != y.PetList[i]) return false;
return true;
}

public int GetHashCode(IdAndList obj)
{
int hash = obj.Id;
if (obj.PetList != null)
foreach (string pet in obj.PetList)
hash = hash * 31 + pet.GetHashCode();
return hash;
}
}

null PetList 的一些测试如果您知道这是不可能的,可以删除 s。

现在:

var viewModel = reports.Select(c => new IdAndList{c.Id, c.PetList}).AsEnumerable()
.GroupBy(c => c, new ReportIdAndPetListComparer())
.Select(g => new ArmReportModel
{
PetList = g.Key.PetList,
Pets = g.Count()
});

或者如果提供商无法处理构建 IdAndPetList输入,然后:

var viewModel = reports.Select(c => new {c.Id, c.PetList})
.AsEnumerable()
.Select(c => new IdAndList{c.Id, c.PetList})
.GroupBy(c => c, new ReportIdAndPetListComparer())
.Select(g => new ArmReportModel
{
PetList = g.Key.PetList,
Pets = g.Count()
});

关于c# - LINQ GroupBy 列表<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211285/

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