2015-12-21 14 views
0

我到處都有這樣的聲明。有一些方法可以在一行中完成這一切嗎?也許在C#6.0中的東西會有所幫助?我只想獲取值,如果有的話,如果沒有,然後返回一個空字符串或NULL。在一行中使用LINQ返回值或空值?

var item = ll.Fields.Where(x => x.FieldTitle == "Loan Amount"); 
if (item.Count() != 0) { 
    LatestItem.VelocifyLoanAmount = double.Parse(item.FirstOrDefault().Value); 
} 

編輯1:這是一個雙重,但我需要得到一個字符串的其他時間。我很喜歡我爲LINQ問題獲得幫助的速度。我的Excel VSTO加載項的問題得到蟋蟀:)

+3

如果你有這樣的語句,那麼你有很多其他的問題,不是其他的代碼庫缺乏簡潔。如果你的double不能被解析呢? –

+0

你可能會更好地提取一個輔助方法,而不是減少到一行。但是,如果不知道確切的重複形式,很難更具體。 –

+0

「LatestItem.VelocifyLoanAmount」的類型是什麼? 'double'或'double?'? –

回答

4

爲什麼不乾脆:

var item = ll.Fields 
    .Where(x => x.FieldTitle == "Loan Amount") 
    .Select(x => (double?)double.Parse(x.Value)) 
    .FirstOrDefault(); 
2

一兩件事你可以做的是以下幾點:

var item = ll.Fields.FirstOrDefault(x => x.FieldTitle == "Loan Amount")?.Value; 
if (!double.TryParse(item, out LatestItem.VelocifyLoanAmount) 
{ 
    // do your error case here 
} 

更新:增加C#6.0的語法縮短語法,並使用首選TryParse,而不是進行錯誤校驗。

更新2:如果由於某種原因double.Parse是首選(例如,如果一個包裝處理一大段代碼的異常),下面是一個簡短的例子。

LatestItem.VelocifyLoanAmount = 
    double.Parse(ll.Fields.FirstOrDefault(x => x.FieldTitle == "Loan Amount")?.Value); 
+0

如果item.FirstOrDefault()拋出null異常,會怎麼樣? –

+0

@Aniket這不應該發生,因爲我們已經檢查過IEnumerable'item'至少有一個元素。 –

+0

@JohnCarpenter你在這裏合併三個支票......一個地方,一個任何地方,一個FirstOrDefault。你認爲這是最有效的解決方案嗎? –

1

您可以使用Select到集合中的對象投射到double?並返回FirstOrDefault

double? parsedFirstValueOrNull = ll.Fields 
    .Where(x => x.FieldTitle == "Loan Amount") 
    .Select(i => (double?)double.Parse(i.Value)) 
    .FirstOrDefault(); 

演員double?是必要的,否則FirstOrDefault會爲空集合返回0.0,這可能是不明確的。

+0

如果double .Parse(i.value).FirstOrDefault()拋出異常? –

+0

@Aniket它會怎麼做?唯一可以拋出的(在'Where'後面)是'double.Parse'。 –

+0

double.Parse是它可以拋出異常的地方:-) –

0

你可以這樣做:

var item = ll.Fields.Where(x = > x.FieldTitle == "Loan Amount").FirstOrDefault(); 
return (item != null) ? item.Value : DefaultReturnValue; 

返回採用三級運營商。第一個值是一個布爾檢查。如果布爾值爲真,那麼在「?」之後的值返回。否則,返回「:」後的值;

+1

爲什麼使用'.Where()'。和'.FirstOrDefault()'在這裏? –

+0

好點David。我在那裏複製和粘貼代碼,並沒有注意到那裏的冗餘,因爲我專注於高等運營商。你可以這樣做: 'var item = ll.Fields.FirstOrDefault(x => x.FieldTitle ==「Loan Amount」);' –

1

我在各地都有這樣的說法。

由於您正在多次這樣做,您可能希望提高效率,而不是減少行數。接近這將被提取的所有字段爲Dictionary一次,然後迅速以項目爲一種方法需要:

var fieldNames = new Set<string> { 
    "Loan Amount", "Loan Balance", "Amount Due" 
}; 
var dict = ll 
    .Fields 
    .Where(f => fieldNames.Contains(f.FieldTitle)) 
    .ToDictionary(f => f.FieldTitle, f => double.Parse(f.Value)); 
dict.TryGetValue("Loan Amount", out LatestItem.VelocifyLoanAmount); 
dict.TryGetValue("Loan Balance", out LatestItem.VelocifyLoanBalance); 
dict.TryGetValue("Amount Due", out LatestItem.VelocifyAmountDue); 
+0

是的。這是一個想法,當他們是相同的類型 – punkouter

+1

@punkouter右鍵。提取不同類型的項目有點棘手,但也可以完成。不幸的是,將一些字段封裝到'object'中會發生,但它仍然可能比多次遍歷列表更快。 – dasblinkenlight