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组合?
还是另一个简单的解决方案?
答案 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) };
}
}
请注意,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
答案 1 :(得分:2)
您在此处尝试执行的操作是按Name
,Len
&amp; Height
,您可以使用LINQ GroupBy
方法执行此操作。
然后,您希望使用Count
属性上的Select
和Sum
聚合将该组投影到新对象。例如:
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个选择
使用递增数字作为其他答案之一
.Select( (x,i) => new { ID = i, ....
该组中的第一个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