To.Take()或不.Take(),这就是问题

时间:2011-03-25 19:54:59

标签: .net linq .net-3.5 ienumerable

我有一个代表每个年龄人口(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()
  

问题

  1. 如果我在.Take(2)上使用where以及补充dr.Year条件,那会不会最好?
  2. 还有更好的选择吗?
  3. 我的方法值得考虑吗?

2 个答案:

答案 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