Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# groupby在linq中不工作,结果与输入相同_C#_Linq_List_Group By - Fatal编程技术网

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();