2009-08-19 35 views
0

我有一個類MyClass與方法:如何聲明在Linq查詢中使用的引用參數變量?

public bool MyMethod(out DateTime? MyDate) { 
    ... 
} 

我想調用此方法以下列方式:

var q = from mc in MyClasses.AsEnumerable() 
     from output in mc.MyMethod(out dt) // how to declare dt? 
     select new { mc, output, dt }; 

顯然,這並不編譯,怎麼我還沒有宣佈爲dt。我可以在查詢之外聲明它,但這並沒有給我一種溫暖的模糊感覺:(a)我不喜歡在大於必要範圍的級別聲明變量,(b)它不是立即直觀地很明顯,對於查詢內的每一行,該值都可以正確計算。

是否有一些語法可以讓我在查詢中聲明DateTime? dt

回答

6

它不只是DT的是,這裏的問題是,你的MyMethod(範圍)將需要返回枚舉爲的SelectMany工作(from子句第二)

不是真的知道你正在嘗試在這裏實現,但我會傾向於讓你的函數返回一個結構或類,其中包含bool和日期,並通過let語句分配...類似...

var qry = from mc in MyClasses.FunctThatReturnsAnIEnumerable() 
      let result = mc.MyMethod() //this returns the struct 
      select new {mc, result.BoolVal, result.DateVal}; 
+0

+1現在這是一個好主意。看到我對@ Marc的回答的評論;這兩個值都有意義和重要性,所以也許將它們放在他們自己的班級中是對的。 – 2009-08-19 13:17:44

5

我的第一個想法是「電子」(這是我的代碼氣味噪音)。我覺得你真的試圖在不屬於它的地方強制使用這種方法。

我的下一個想法是簡單地創造你想要的行爲,或許真的如(雖然我還是不建議這是一個很好的解決方案):

public DateTime? GetMyDate() 
{ 
    DateTime? dt; 
    MyMethod(out dt); 
    return dt; 
} 

則...

var q = from mc in MyClasses.AsEnumerable() 
     select new { mc, output, Date = GetMyDate() }; 

我假設從MyDate返回的bool在這種情況下並不重要,這實際上打破了意圖。我只假設因爲,根據你想要的結果,你似乎也不關心布爾回報。

在這兩種情況下,我都會建議重新考慮這個問題,而不是根據你的要求做出應有的決定。

+0

那麼,「ew」評論足夠有趣,但爲什麼你忽略了我可能需要「輸出」和MyDate的可能性?事實上,在我的「真實」代碼中,MyMethod的輸出是我最感興趣的東西(它的意思是有效的),並且日期時間是到期日(直到它有效)。這兩個價值觀都有其內在的重要意義 – 2009-08-19 13:15:43

+0

我解僱它,因爲在你的示例用法中,你這樣做。我並不是暗示它可能無法滿足其他地方的某些需求,根本就不在這裏。看起來你的願望是重用。因爲它可能,我的建議,而不是看你的來源,是提取填充你的日期時間和調用* that *在這裏(和你的MyDate(..)函數)的基礎邏輯。對不起,我並不是想暗示它在另一個環境中沒有用處。 – Marc 2009-08-19 13:19:10

+0

啊,回想起來,我現在看到你是如何嘗試使用輸出的。對不起,語法完全丟掉了我。 +1給Tim以捕捉它並提供可用的解決方案。 – Marc 2009-08-19 13:27:25