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

时间:2015-06-02 19:13:44

标签: c# linq lambda

我有以下对象:

node.js

我有这些对象的列表。我想先进行计算,然后先用“CompanyId”对Ids进行分组。然后,对于每个公司ID,将3个不同的SampleIds数据添加到一起,并为每个公司返回一个新对象。

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

public class Bar
{
    public Int32 CompanyId 
    public Decimal Data  
}

我在执行分组后遇到了如何执行计算的问题。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

你看起来非常接近我。

这应该有效:

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

或者,如果您想过滤掉2,4,6作为样本ID(不能说我理解为什么说实话)那么这可能会有效:

[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);
}