我有一个与yesterday's question类似的问题 我有这个List< object []>
List<object[]> olst = new List<object[]>();
olst.Add(new object[] { "AA1", "X", 1, 3.50 });
olst.Add(new object[] { "AA2", "Y", 2, 5.20 });
olst.Add(new object[] { "AA2", "Y", 1, 3.50 });
olst.Add(new object[] { "AA1", "X", 1, 3.20 });
olst.Add(new object[] { "AA1", "Y", 2, 5.30 });
我需要生成List&lt; object []&gt;持有这个:
"AA1", "X", 2, 6.70
"AA2", "Y", 3, 8.70
"AA1", "Y", 2, 5.30
换句话说,我需要按每个对象[]的第一和第二元素对olst进行分组,并将第三和第四即可。
我可以使用for循环,但我希望有人可以帮我使用lambda表达式和/或linq来实现这一点。
答案 0 :(得分:6)
List<object[]> olst = new List<object[]>();
olst.Add(new object[] { "AA1", "X" });
olst.Add(new object[] { "AA2", "Y" });
olst.Add(new object[] { "AA2", "Y" });
olst.Add(new object[] { "AA1", "X" });
olst.Add(new object[] { "AA1", "Y" });
var result = from ol in olst
group ol by new {p1 = ol[0], p2 = ol[1]}
into g
select g.First();
这样的东西?
答案 1 :(得分:4)
您需要按匿名类型分组,然后对第三和第四列求和:
List<object[]> grouped = olst
.GroupBy(o => new { Prop1 = o[0].ToString(), Prop2 = o[1].ToString() })
.Select(o => new object[]
{
o.Key.Prop1,
o.Key.Prop2,
o.Sum(x => (int)x[2]),
o.Sum(x => (double)x[3])
})
.ToList();
答案 2 :(得分:0)
正如评论中所建议的那样,我会选择使用Tuple
并使用HashSet,因为只有当项目不存在时它才会附加(也很快)。如果将项添加到hashset,只要您的类型提供必要的Equals和GetHashCode方法,就不需要选择distinct。
像这样:
var olst = new HashSet<Tuple<string,string>>();
olst.Add(Tuple.Create("AA1", "X"));
olst.Add(Tuple.Create("AA1", "X"));
olst.Add(Tuple.Create("AA2", "Y"));
olst.Add(Tuple.Create("AA2", "Y"));
如果需要,可以将其转换为列表。这是一个例子:
olst.ToList().ForEach(x=> Console.WriteLine(x.Item1 + " " + x.Item2));
将打印出来
AA1 X
AA2 Y