通过在满足条件时添加项目来创建列表

时间:2018-06-19 06:57:35

标签: c# linq

public class Connector
{
    public double Id { get; set; }
    public string Name { get; set; }
    public double Len { get; set; }
    public double Height { get; set; }
    public double Count { get; set; }
}

我有这样的设施清单:

List<Connector> resutsList = new List<Connector>();

以下是此类列表内容的示例:

1 | IZO | 1000 | 200 | 2
2 | IZO | 1000 | 200 | 4
3 | IZO | 600  | 200 | 5
4 | IZO | 1000 | 200 | 2
5 | IZO | 600  | 180 | 7
6 | IZO | 600  | 180 | 3

我需要这样的结果:(这是满足Len和Height条件时Count计数的总和。)

1 | IZO | 1000 | 200 | 8
2 | IZO | 600  | 200 | 5
3 | IZO | 600  | 180 | 10

是否可以进行任何Linq组合?

还是另一个简单的解决方案?

3 个答案:

答案 0 :(得分:3)

这是我的努力。

class Program
{
    public class Connector
    {
        public Connector(double id, string name, double len, double height, double count)
        {
            Id = id;
            Name = name;
            Len = len;
            Height = height;
            Count = count;
        }

        public double Id { get; set; }
        public string Name { get; set; }
        public double Len { get; set; }
        public double Height { get; set; }
        public double Count { get; set; }
    }

    static void Main(string[] args)
    {
        var l = new List<Connector>
        {
            new Connector(1, "IZO", 1000, 200, 2),
            new Connector(2, "IZO", 1000, 200, 4),
            new Connector(3, "IZO", 600, 200, 5),
            new Connector(4, "IZO", 1000, 200, 2),
            new Connector(5, "IZO", 600, 180, 7),
            new Connector(6, "IZO", 600, 180, 3)
        };

        var sums = from c in l
                   group c by new { c.Name, c.Len, c.Height } into g
                   select new { g.First().Id, g.Key.Name, g.Key.Len, g.Key.Height, Count = g.Sum(x => x.Count) };

    }
}

``` enter image description here

请注意,ids与您的示例不完全相同。 (1,2,3对1,3,5)

我不相信你可以使用查询表达式语法获取索引,但这是另一种Linq方法来实现它并获得所需的索引:

            var sums = l.GroupBy(c => new { c.Name, c.Len, c.Height })
            .Select((g, index) => new{
                Id = index+1,
                g.Key.Name,
                g.Key.Len,
                g.Key.Height,
                Count = g.Sum(x => x.Count)
            });

请注意index + 1

enter image description here

答案 1 :(得分:2)

您在此处尝试执行的操作是按NameLen&amp; Height,您可以使用LINQ GroupBy方法执行此操作。

然后,您希望使用Count属性上的SelectSum聚合将该组投影到新对象。例如:

var result = list
    .GroupBy(x => new { x.Name, x.Len, x.Height })
    .Select(x => new {  x.Key.Name, x.Key.Len, x.Key.Height, Count = x.Sum(y => y.Count) })
    .ToList();

至于ID - 它在集合操作中具有有限的意义。你基本上有2个选择

  1. 使用递增数字作为其他答案之一

    .Select( (x,i) => new { ID = i, ....
    
  2. 该组中的第一个ID

    .Select(x => new {  ID = x.First().ID, ....
    

答案 2 :(得分:0)

你可以试试

  

这里我们通过三个条件Name,Len,Height对resultList的元素进行分组。然后我们通过使用Len,Height,Name,& Id然后我们Sum创建一个新的Connector对象,使用Count中的所有元素该组并将Sum var与var List = from result in resultList group d by new { d.Name, d.Len , d.Height} into g select new Connector ( Id = g.First().ID, Name = g.Key.Name, Len = g.Key.Len, Height = g.Key.Height, count = g.Sum(s => s.Count) ); 分配。

`MERGE INTO regional_dummy a USING (SELECT c.ID as IDNO FROM   region_country c    WHERE c.parent_id = '2' ) b ON ('true' = 'false') --WHEN MATCHED THEN UPDATE <TODO> WHEN NOT MATCHED THEN   INSERT      (       id,     REGIONAL_userid,     REGIONAL_NAME ,    REGIONAL_EMAIL ,    CREATE_DATE ,    CREATED_BY ,    REGION_ID,    COUNTRY_ID,    PRODUCT_ID,    ACTIVE,    REPLACE_FLAG0    )0    VALUES    (      REGIONAL_SEQ.nextval,  '12345rg',  'userName',  'userEmailId',  sysdate,  'rgrover0',  '2',  b.IDNO,  'm_product_region',  'Y' ,  'N'   );`

注意: - 如果你想要参考@ tymtam的答案,这不会产生递增ID