5

昨日の質問に似た質問があります。
私はこのリストを持っています<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

つまり、olstを各object []の1番目2番目の要素でグループ化し、 3番目4番目を合計する必要があります。
forループを使用することもできますが、誰かがラムダ式や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

匿名型でグループ化し、3 番目と 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 を使用することもできます。ハッシュセットにアイテムを追加する場合、タイプが必要な 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
于 2012-12-20T19:52:40.033 に答える