5

我有一个与昨天的问题类似的问题。
我有这个 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<object[]> 来保存它:

"AA1", "X", 2, 6.70
"AA2", "Y", 3, 8.70
"AA1", "Y", 2, 5.30

换句话说,我需要按每个 object[]的第一个第二个元素对 olst 进行分组,并对3rd4th求和。
我可以使用 for 循环,但我希望有人可以帮助我使用 lambda 表达式和/或 linq 来完成此操作。

4

3 回答 3

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

像这样的东西?

于 2012-12-20T19:43:54.903 回答
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();
于 2012-12-20T19:57:15.557 回答
0

正如评论中所建议的那样,我会选择Tuple并可能使用 HashSet ,因为它只会在 item 不存在时追加(而且它很快)。如果您将项目添加到 hashset,则无需选择 distinct,只要您的类型提供必要的 Equals 和 GetHashCode 方法。
像这样的东西:

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
于 2012-12-20T19:52:40.033 回答