C# 使用Linq和Lambda表达式在列表中执行计算

C# 使用Linq和Lambda表达式在列表中执行计算,c#,linq,lambda,C#,Linq,Lambda,我的目标如下: public class Foo { public Int32 Id public Int32 SampleId public Int32 CompanyId public Decimal Data } public class Bar { public Int32 CompanyId public Decimal Data } 我有这些物品的清单。我想执行一个计算,首先按“CompanyId”对ID进行分组。然后

我的目标如下:

public class Foo
{
    public Int32 Id 
    public Int32 SampleId 
    public Int32 CompanyId 
    public Decimal Data 
}

public class Bar
{
    public Int32 CompanyId 
    public Decimal Data  
}
我有这些物品的清单。我想执行一个计算,首先按“CompanyId”对ID进行分组。然后,为每个公司ID添加3个不同的SampleID数据,并为每个公司返回一个新对象

//I want to get the data from SampleId = 2, 4 and 6 added together 
//from the Foo object and put into the Data of the new Bar object.
List.GroupBy(l => l.CompanyId).Select( x => new Bar { CompanyId = x.Key, ????? } );

我被困在如何执行分组后的计算。非常感谢您的帮助。

您看起来离我很近

这应该起作用:

    var list = new List<Foo>
                   {
                       new Foo { CompanyId = 1, Data = 15, Id = 1, SampleId = 2 },
                       new Foo { CompanyId = 1, Data = 10, Id = 2, SampleId = 4 },
                       new Foo { CompanyId = 1, Data = 25, Id = 2, SampleId = 6 }
                   };

    var output = list.GroupBy(
        l => l.CompanyId,
        (key, data) => new Bar { CompanyId = key, Data = data.Sum(d => d.Data) });
[Test]
public void Testing()
{
    var list = new List<Foo>
                   {
                       new Foo { CompanyId = 1, Data = 15, Id = 1, SampleId = 2 },
                       new Foo { CompanyId = 1, Data = 10, Id = 2, SampleId = 4 },
                       new Foo { CompanyId = 1, Data = 25, Id = 3, SampleId = 8 },
                       new Foo { CompanyId = 1, Data = 25, Id = 4, SampleId = 12 },
                       new Foo { CompanyId = 1, Data = 25, Id = 5, SampleId = 14 }
                   };

    var filterList = new List<int> { 2, 4, 6 };

    var output = list.Where(l => filterList.Contains(l.SampleId))
        .GroupBy(l => l.CompanyId, (key, data) => new Bar { CompanyId = key, Data = data.Sum(d => d.Data) });

    Assert.True(output != null);
    Assert.True(output.FirstOrDefault() != null);
    Assert.True(output.FirstOrDefault().Data == 25);
}
var list=新列表
{
新Foo{CompanyId=1,Data=15,Id=1,SampleId=2},
新Foo{CompanyId=1,Data=10,Id=2,SampleId=4},
新Foo{CompanyId=1,Data=25,Id=2,SampleId=6}
};
var输出=list.GroupBy(
l=>l.CompanyId,
(key,data)=>newbar{CompanyId=key,data=data.Sum(d=>d.data)});
或者,如果您只想筛选出2,4,6作为样本id(老实说,我不知道为什么),那么这可能会起作用:

    var list = new List<Foo>
                   {
                       new Foo { CompanyId = 1, Data = 15, Id = 1, SampleId = 2 },
                       new Foo { CompanyId = 1, Data = 10, Id = 2, SampleId = 4 },
                       new Foo { CompanyId = 1, Data = 25, Id = 2, SampleId = 6 }
                   };

    var output = list.GroupBy(
        l => l.CompanyId,
        (key, data) => new Bar { CompanyId = key, Data = data.Sum(d => d.Data) });
[Test]
public void Testing()
{
    var list = new List<Foo>
                   {
                       new Foo { CompanyId = 1, Data = 15, Id = 1, SampleId = 2 },
                       new Foo { CompanyId = 1, Data = 10, Id = 2, SampleId = 4 },
                       new Foo { CompanyId = 1, Data = 25, Id = 3, SampleId = 8 },
                       new Foo { CompanyId = 1, Data = 25, Id = 4, SampleId = 12 },
                       new Foo { CompanyId = 1, Data = 25, Id = 5, SampleId = 14 }
                   };

    var filterList = new List<int> { 2, 4, 6 };

    var output = list.Where(l => filterList.Contains(l.SampleId))
        .GroupBy(l => l.CompanyId, (key, data) => new Bar { CompanyId = key, Data = data.Sum(d => d.Data) });

    Assert.True(output != null);
    Assert.True(output.FirstOrDefault() != null);
    Assert.True(output.FirstOrDefault().Data == 25);
}
[测试]
公开无效测试()
{
变量列表=新列表
{
新Foo{CompanyId=1,Data=15,Id=1,SampleId=2},
新Foo{CompanyId=1,Data=10,Id=2,SampleId=4},
新Foo{CompanyId=1,Data=25,Id=3,SampleId=8},
新Foo{CompanyId=1,Data=25,Id=4,SampleId=12},
新Foo{CompanyId=1,Data=25,Id=5,SampleId=14}
};
var filterList=新列表{2,4,6};
var output=list.Where(l=>filterList.Contains(l.SampleId))
.GroupBy(l=>l.CompanyId,(key,data)=>newbar{CompanyId=key,data=data.Sum(d=>d.data)});
Assert.True(输出!=null);
Assert.True(output.FirstOrDefault()!=null);
Assert.True(output.FirstOrDefault().Data==25);
}

那么所有者ID应该是什么?它总是样本2,4,6吗?听起来有点奇怪…OwnerId可以是任何数字。它不用于任何计算,所以我只想让它通过。对于每个公司,我想为相同的3个样本添加数据。这有意义吗?从什么地方传过来的?如果您有三个不同的示例,则可能有三个不同的OwnerId值。如果一组中只有1到2个样本,你会怎么做?如果有3个以上的样品,您应该如何选择使用哪3个?这里缺少很多上下文…你是对的,我也把自己弄糊涂了。让我们拿出自己的身份证。我现在更新这个问题。看来你很快就能找到答案了。Try:
newbar{CompanyId=x.Key,Data=x.Sum(a=>a.Data)}
还有其他SampleId值。我在哪里过滤掉这些?它应该在手之前(在GoupBy之前)还是之后完成?只是补充说,现在对你来说,过滤器列表可以从任何地方拉出来,只要它是一个整数列表,现在就可以使用扳手。如果我想用这个公式而不是简单的求和:SampleId1+(SampleId2*2)+SampleId6怎么办?是否可以操纵查询来执行类似的操作,或者我必须在数据上运行自己的循环才能执行此操作?(不管怎样,我都会接受这个正确答案)实际需要的公式是什么?你是想把SampleId1放在那里吗?对不起,SampleId2+(SampleId4*2)+SampleId6。使用相同的3个项目是可以的。