C# groupby在linq中不工作,结果与输入相同
我有一个这样的结构:C# groupby在linq中不工作,结果与输入相同,c#,linq,list,group-by,C#,Linq,List,Group By,我有一个这样的结构: public class DebtCreditorRPT { [DisplayName("شناسه مشتری")] public string Memberid { get; set; } [DisplayName("نام ")] public string Name { get; set; } [DisplayName("مبلغ")] public stri
public class DebtCreditorRPT
{
[DisplayName("شناسه مشتری")]
public string Memberid { get; set; }
[DisplayName("نام ")]
public string Name { get; set; }
[DisplayName("مبلغ")]
public string Amount { get; set; }
}
companyname amount
a 26
b 13
价值观如下:
id companyname amount
1 a 12
2 b 13
1 a 14
并使用groupby进行如下查询:
但它不起作用。我从上面的查询中得到的结果类似于输入:
id companyname amount
1 a 12
2 b 13
1 a 14
为什么?
以下是我得到的真实结果:
致以最诚挚的问候尝试将您的查询更改为:
List<DebtCreditorRPT> result=new List<DebtCreditorRPT>();
result.GroupBy(i=>i.Name).Select(g => new
{
Name = g.Key,
Amount = g.Sum(x => double.Parse(x.Amount))
}).ToList();
看起来您需要按id和名称分组
result.GroupBy(i => new {i.Memberid, i.Name}).Select(g => new
{
Name = g.Key.Name,
Amount = g.Sum(x => double.Parse(x.Amount))
}).ToList();
看起来好像您假定GroupBy更改了应用它的输入集合。情况并非如此,它返回一个新集合。在您的示例中,分组集合甚至与输入集合的类型不同 试试这个:
List<DebtCreditorRPT> groupedList = nonGroupedList.GroupBy(i => new
{
i.Memberid,
i.Name
}).Select(g => new DebtCreditorRPT
{
Name = g.Key.Name,
Amount = g.Sum(x => double.Parse(x.Amount)).ToString(),
Memberid = g.Key.Memberid
}).ToList();
我在VB.Net中工作时遇到了同样的问题,而不是C,而且与C不同,VB.Net通过引用而不是组件值来比较匿名类型。为了避免这种情况,您必须使用Key关键字显式地将特定字段指定为键: 我知道你在C语言中工作,所以我不确定为什么建议的答案对你不适用。Linq似乎在使用项目的内存地址进行比较,即使字段完全相同,而不是单个元素,每个项目的内存地址也会不同 要以您想要的方式进行分组,可以使用从关键元素的值连接而来的字符串。这是因为字符串是根据其内容而不是内存中的地址进行比较的:
result.GroupBy(i => i.Memberid.ToString() + i.Name).Select(g => new
{
Name = g.FirstOrDefault().Name,
Amount = g.Sum(x => double.Parse(x.Amount))
}).ToList();
看起来您想按名称分组否我需要按id分组如果您按id分组,则g.Key将是id,而不是您需要一次按多个属性分组的名称如果您按id分组,则每个组将只有一个值。难怪结果看起来和输入一样。同样,我的结果是InPushow?Select返回具有两个属性的内容:{Name,Amount}。但我发现了一个不同的错误。Ned Stoyanov的回答是正确的请看我帖子上的照片我看了这张照片。我不知道这张图片是如何生成的,但它不是语句的输出。Ned的回答将产生您声称需要的输出。我这样做,但结果与输入相同,我是否应将结果保存在另一个列表中?如果您将结果作为输入传递,请确保使用ref参数
result.GroupBy(i => New With {Key i.Memberid, Key i.Name}).Select(g => new
{
Name = g.Key.Name,
Amount = g.Sum(x => double.Parse(x.Amount))
}).ToList();
result.GroupBy(i => i.Memberid.ToString() + i.Name).Select(g => new
{
Name = g.FirstOrDefault().Name,
Amount = g.Sum(x => double.Parse(x.Amount))
}).ToList();