30

.net Aggregate 関数が次のように機能する簡単な例を見てきました。

string[] words = { "one", "two", "three" };
var res = words.Aggregate((current, next) => current + ", " + next);
Console.WriteLine(res);

より複雑なタイプを集約したい場合、「集約」関数をどのように使用できますか? 例: 'key' と 'value' などの 2 つのプロパティを持つクラスで、次のような出力が必要な場合:

"MyAge: 33, MyHeight: 1.75, MyWeight:90"
4

4 に答える 4

57

次の 2 つのオプションがあります。

  1. に投影してからstring集計します。

    var values = new[] {
        new { Key = "MyAge", Value = 33.0 },
        new { Key = "MyHeight", Value = 1.75 },
        new { Key = "MyWeight", Value = 90.0 }
    };
    var res1 = values.Select(x => string.Format("{0}:{1}", x.Key, x.Value))
                    .Aggregate((current, next) => current + ", " + next);
    Console.WriteLine(res1);
    

    これには、最初の要素をシードとして使用するという利点がありますstring(先頭に ", " を付けません) が、プロセスで作成される文字列により多くのメモリを消費します。

  2. シード、おそらくStringBuilder:を受け入れる集計オーバーロードを使用します。

    var res2 = values.Aggregate(new StringBuilder(),
        (current, next) => current.AppendFormat(", {0}:{1}", next.Key, next.Value),
        sb => sb.Length > 2 ? sb.Remove(0, 2).ToString() : "");
    Console.WriteLine(res2);
    

    2 番目のデリゲートは、条件を使用して先頭の ", " をトリムするためにourStringBuilderを に変換します。string,

于 2009-10-02T11:42:51.097 に答える
6

Aggregateには3つのオーバーロードがあるため、異なるタイプのオーバーロードを使用して、列挙しているアイテムを累積できます。

シード値(カスタムクラス)を渡す必要があり、追加するメソッドはシードを1つの値とマージします。例:

MyObj[] vals = new [] { new MyObj(1,100), new MyObj(2,200), ... };
MySum result = vals.Aggregate<MyObj, MySum>(new MySum(),
    (sum, val) =>
    {
       sum.Sum1 += val.V1;
       sum.Sum2 += val.V2;
       return sum;
    }
于 2009-10-02T02:40:54.150 に答える
4

Aggregate 関数はデリゲート パラメーターを受け入れます。デリゲートを変更して、必要な動作を定義します。

var res = data.Aggregate((current, next) => current + ", " + next.Key + ": " + next.Value);
于 2009-10-02T02:33:04.443 に答える
-1

または string.Join() を使用します。

var values = new[] {
    new { Key = "MyAge", Value = 33.0 },
    new { Key = "MyHeight", Value = 1.75 },
    new { Key = "MyWeight", Value = 90.0 }
};
var res = string.Join(", ", values.Select(item => $"{item.Key}: {item.Value}"));
Console.WriteLine(res);
于 2018-03-18T12:54:00.837 に答える