2011-03-25 41 views
5

我有一個代表每個年齡段人口(M,F)的集合。To .Take()或不.Take(),這就是問題

爲了通過時間計算人口,我必須先與女性進行計算,以便根據男性出生率的統計常數計算新生男性和女性的比例。

也就是說,我有第一個矩陣,其中包含每年年齡的男性和女性人口。現在

// 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年以後的每個年齡段的家庭費率。因此,爲了僅考慮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)一起在dr.Year補充where條件?
  2. 有沒有更好的選擇?
  3. 我的方法值得考慮嗎?

回答

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 
+0

+1用於說明'TakeWhile'方法行爲。我會考慮使用'Take'。除了我的「Take()」問題之外,我還想向用戶保證他可以依靠「修復」索引來爲收集索引。這是一個Fortran應用程序現代化項目,用戶用於使用索引並使用多維矩陣。所以,我想我應該'OrderBy'和'Take'之後。我的邏輯聽起來不錯嗎? – 2011-03-25 22:21:43

+0

@很抱歉,我認爲我的大腦已經檢查了一天,因爲你的問題聽起來應該是有意義的,但我無法想象你的意思。 – Davy8 2011-03-25 22:30:52

1

我就已經包括在從句中查詢where子句中的TakeWhile電話,有沒有理由,你爲什麼不這樣做呢?從長遠來看,兩者之間可能沒有太大差別,但TakeWhile似乎沒有必要,並且會讓您的代碼更加混亂,IMO。

+0

+1我從來沒有想過它是這樣的。事實上,可讀性在這裏非常重要,因爲這些代碼不會由IT人員維護,而是由用戶維護。謝謝! – 2011-03-25 22:16:53

+0

用戶維護?這聽起來很可怕 - 祝你好運! – 2011-03-25 23:23:29