5

と の 2 つのプロパティを持つオブジェクトのリストがありaますba次のような列挙型です。

[Flags] enum MyEnum
{
    first  = 1,
    second = 2,
    third  = 4,
    fourth = 8
};

bマスク(MyEnum フラグの組み合わせ) である符号なし整数です。

今、私はすべてのオブジェクトをそれらで合計する必要がありますa-つまり、オブジェクトを2回合計することができ、それらobj.a = first | thirdに対してaを実行できないようですgroupBy。それらを合計する別の方法はありますか?

コードを共有していなくて申し訳ありませんが、共有できません。いくつかの if - else ブロックで foreach を使用したことはわかりますが、Linq でそれを行う方法を学ぶ必要があると思います

編集: 私は明確ではなかったと思います。列挙型でオブジェクトを合計したい、つまり次の場合:

obj1.a = first, obj1.b = 5
obj2.a = first | second, obj2.b = 3

出力は次のようになります

first sum = 8
second sum = 3
4

2 に答える 2

3

HasFlag と GetValues を使用して、特定の列挙値のすべてのフラグを抽出してみてください。

var objs = new[] { new { a = MyEnum.first | MyEnum.second }, new { a = MyEnum.first }... };
var enumValues = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToArray();

// first, use SelectMany to create a sequence with one instance of each object for
// each flag value in it's a
var grouped = objs.SelectMany(
        o => enumValues.Where(flag => o.a.HasFlag(flag))
            .Select(v => new { o, flag })
    )
    // then group by the extracted flag value
    // the element selector (t => t.o) gets us back to an IGrouping of o's (dropping the extra flag property
    .GroupBy(t => t.flag, t => t.o);

 // finally, we can get sums by a as follows:
 var sumsByA = grouped.ToDictionary(g => g.Key, g => g.Sum(o => o.b));
于 2013-08-02T09:43:08.367 に答える