我有一个代表每个年龄人口(M,F)的集合。
为了通过时间来预测人口,我必须首先与女性进行计算,以便根据男性出生率的统计常数计算新生男女的百分比。
那就是说,我有一个第一个矩阵,其中包含每年的男性和女性人口。
// Where 1 is the evaluation Id and 2009 the year I want the
// initial population information for.
IList<AnnualPopulation> initialPopulation =
LoadMatrix<AnnualPopulation>(1, 2009);
现在,为了首先预测女性人口,我使用以下内容:
IList<AnnualPopulation> initialWomenPopulation = (
from w in initialPopulation
where String.Equals("F", w.Gender)
select w
).FirstOrDefault();
我必须考虑当前(第一年(2009年))和我希望预测的年份的死亡率,我已经从中确定了每个年龄段的死亡率。
IList<AnnualDeathRate> deathRates = LoadMatrix<AnnualDeathRate>(1, 2009)
这将加载2009年及以后每年的deather率。因此,为了仅考虑2009年和2010年,让我们说,我使用了以下Linq代码。
AnnualDeathRate[] femaleDeathRates = (
from fdr in deathRates
where (string.Equals("F", fdr.Gender))
select fdr
).TakeWhile(dr =>
initialWomenPopulation.Year == dr.Year ||
dr.Year == initialWomenPopulation.Year + 1
).ToArray()
问题
.Take(2)
上使用where
以及补充dr.Year
条件,那会不会最好?答案 0 :(得分:1)
我会在查询的TakeWhile
子句中的where
调用中包含该子句,是否有理由不这样做?从长远来看,两者之间可能没有那么大差异,但TakeWhile
似乎没有必要,并且使你的代码更加混乱,IMO。
答案 1 :(得分:1)
实际上#1可能会产生与当前代码不同的结果。例如,如果订单是随机的(我没有在任何地方看到任何排序),那么当前代码可能会返回任意数量的结果(例如,如果第一个元素与任一条件都不匹配,则没有结果,即使后续条件也是如此)
听起来方法#1会更正确(除非你真的想要TakeWhile
的行为)你说你想要的前2个结果与给定的条件匹配,无论它们是否是第一个最初的清单。
例如
var numbers = new[] {2, 3, 1, 4};
Console.WriteLine("TakeWhile");
foreach(var n in numbers.TakeWhile(x => x == 1 || x == 2))
{
Console.Write(n);
}
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("WhereTake2");
foreach (var n in numbers.Where(x => x == 1 || x == 2).Take(2))
{
Console.Write(n);
}
打印:
TakeWhile
2
WhereTake2
21