Я использую LINQ для объектов, чтобы суммировать значения в двух объектах и возвращать одну единственную версию объекта с суммированными итогами.LINQ Lambda Summing NULL
Проблема, с которой я сталкиваюсь, заключается в том, что функция суммы LINQ суммирует NULL как ноль (0). Я ожидал бы, что если бы у меня было значение «15», а другое значение «нуль», то сумма должна быть «15». Но я ожидал бы, что если первое значение было «null», а второе значение было «null», то сумма также должна быть «null». Однако мне говорят, что сумма равна «0».
Как я могу заставить его функционировать так, как я ожидал бы? Я хочу, чтобы он вел себя, возвращая значение, если есть хотя бы одно значение или возвращает «null», если нет значений.
Теперь для некоторого кода:
virtual public IStatSplit Totals
{
get
{
var cSplit = _splits.Where(s => s.Split == SplitType.COMBINED).SingleOrDefault();
if(cSplit != null)
{ return cSplit; }
cSplit = _splits.Where(s => s.Split != SplitType.COMBINED)
.GroupBy(g => 1 == 1).Select(x => new StatSplit
{
AB = (uint?)x.Sum(q => q.AB),
CI = (uint?)x.Sum(q => q.CI),
B2 = (uint?)x.Sum(q => q.B2),
B3 = (uint?)x.Sum(q => q.B3),
GDP = (uint?)x.Sum(q => q.GDP),
H = (uint?)x.Sum(q => q.H),
HB = (uint?)x.Sum(q => q.HB),
HR = (uint?)x.Sum(q => q.HR),
RBI = (uint?)x.Sum(q => q.RBI),
IBB = (uint?)x.Sum(q => q.IBB),
SF = (uint?)x.Sum(q => q.SF),
SH = (uint?)x.Sum(q => q.SH),
SO = (uint?)x.Sum(q => q.SO),
BB = (uint?)x.Sum(q => q.BB),
Split = SplitType.COMBINED
}).SingleOrDefault();
return cSplit;
}
}
А вот тестовые данные, которые не будут проходить тест блока:
[TestMethod]
public void PitchingTotals()
{
var splits = GetSplits();
var pitching = new Base.Pitching();
pitching.Splits = splits;
var expected = GetTotalSplit();
var result = pitching.Totals;
// result.RBI = 0
// expected.RBI = null
// this fails because the "0" is not expected
Assert.AreEqual(expected, result);
}
private List<IStatSplit> GetSplits()
{
var lhSplit = new Base.StatSplit
{
AB = 442,
H = 97,
B2 = 14,
B3 = 0,
HR = 6,
BB = 28,
HB = 6,
SF = 1,
SH = 5,
SO = 73,
GDP = 7,
IBB = 4,
CI = 0,
RBI = null,
Split = Enumerations.SplitType.VS_LEFT
};
var rhSplit = new Base.StatSplit
{
AB = 633,
H = 101,
B2 = 9,
B3 = 0,
HR = 5,
BB = 34,
HB = 1,
SF = 1,
SH = 10,
SO = 195,
GDP = 11,
IBB = 2,
CI = 0,
RBI = null,
Split = Enumerations.SplitType.VS_RIGHT
};
List<IStatSplit> splits = new List<IStatSplit>();
splits.Add(lhSplit);
splits.Add(rhSplit);
return splits;
}
private IStatSplit GetTotalSplit()
{
var split = new Base.StatSplit
{
AB = 1075,
H = 198,
B2 = 23,
B3 = 0,
HR = 11,
BB = 62,
HB = 7,
SF = 2,
SH = 15,
SO = 268,
GDP = 18,
IBB = 6,
CI = 0,
RBI = null,
Split = Enumerations.SplitType.COMBINED
};
return split;
}
Позвольте мне попробовать это и вернуться к вам. –
Прохладный, это сработало. Благодаря! –