new BuffA { Target = 0, Type = 0, Value = 30 },
new BuffA { Target = 0, Type = 0, Value = 60 },
new BuffA { Target = 0, Type = 1, Value = 10 },
new BuffA { Target = 1, Type = 0, Value = 80 },
new BuffB { Value = 30 },
new BuffB { Value = 60 },
new BuffC { Value = 10 },
new BuffC { Value = 20 },
.GroupBy(x => x.GetMergeType(), x => (name: x.GetType().Name, value: x.GetValue()))
.Select(x => (x.First().name, x.Sum(y => y.value)))
public virtual int GetMergeType()
=> GetType().GetHashCode();
public virtual int GetValue() => 0;
public class BuffA : Buff
public int Target { get; set; }
public int Type { get; set; }
public int Value { get; set; }
public override int GetMergeType()
=> (base.GetMergeType() * 6151) ^ (Target * 3079) ^ Type.GetHashCode();
public override int GetValue() => Value;
public class BuffB : Buff
public int Value { get; set; }
public override int GetMergeType()
public override int GetValue() => Value;
public class BuffC : Buff
public int Value { get; set; }
public override int GetValue() => Value;