給定一個MyEnum
和MyClass
[Flags]
enum MyEnum
{
first = 1,
second = 2,
third = 4,
forth = 8
}
class MyClass
{
public MyEnum MyEnum;
public uint Value;
}
而一些值
var mcs = new[] {
new MyClass { MyEnum = MyEnum.first | MyEnum.third, Value = 10 },
new MyClass { MyEnum = MyEnum.second, Value = 20 },
new MyClass { MyEnum = MyEnum.first, Value = 100 },
};
這LINQ表達式將返回用於枚舉的值的總和的每一個值。
var ret = from p in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()
select new { MyEnum = p, Sum = mcs.Where(q => q.MyEnum.HasFlag(p)).Sum(q => q.Value) };
注意,它會返回一個「行」甚至MyEnum.fourth
與價值0
。
表達始於枚舉(Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()
)的值,然後對每個值它總結認爲有mcs
的值相同MyEnum
(mcs.Where(q => q.MyEnum.HasFlag(p)).Sum(q => q.Value)
)
如果你要排除的枚舉值未使用:
var ret = from p in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()
let temp = mcs.Where(q => q.MyEnum.HasFlag(p)).Select(q => q.Value).ToArray()
where temp.Length > 0
select new { MyEnum = p, Sum = temp.Sum(q => q) };
表達與枚舉(Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()
)的值開始,然後爲每個值爲「保存」的是具有mcs
的值的相同MyEnum
(在temp
中跳過temp
(where temp.Length > 0
),並將其餘的temp
(select new { MyEnum = p, Sum = temp.Sum(q => q) }
)加起來。請注意,如果您使用uint
,則必須使用temp.Sum(q => q)
,但要使用int
,則可以使用temp.Sum()
(或者您可以使用temp.Sum(q => q)
)。
另一種方式是通過雙from
和group by
var ret = from p in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()
from q in mcs
where q.MyEnum.HasFlag(p)
group q.Value by p into r
select new { MyEnum = r.Key, Sum = r.Sum(p => p) };
這可能等同於使用SelectMany
通過ChaseMedallion(雙from
被編譯器轉換爲SelectMany
)
可能你的建議提供預期的結果?你的問題不是很清楚我的問題 –
你的問題仍然不清楚。如果我們有'obj3 = first |怎麼辦?秒|第三;「什麼是和?他們可以是「第一總和= 15」,「第二總和= 8」,「第三總和= 3」,「第四總和= 7」,「第五總和= 8」,「第六總和= 14」 –
@KingKing正好。我通過枚舉值求和,所以如果一個對象在枚舉中的第一個|第二個|第三個和第三個值的字段中,那麼3將被添加到第一個,第二個和第三個之和 –