2011-10-07 98 views
0

我創建了一個結構和列表。查詢列表 - 只返回一個值

public struct CarMake 
{ 
    public string name; 
    public string id; 

} 

我加了結構對象本(汽車製造商),我試圖查詢

 string selCar = from c in carMakers 
       where c.name == selectedCarMfgName 
       select c.id; 

我越來越近選擇陳述式的錯誤cannont含蓄的IEnumerable轉換爲字符串。我知道查詢只返回一個值,這就是爲什麼我喜歡這樣。

謝謝!

回答

0
 carMakers.Add(new CarMake() { name = "Audi", id = "1234" }); 
     string selCar =(from c in carMakers 
         where c.name == "Audi" 
         select c.id).FirstOrDefault(); 

輸出 - 1234

2
string selCar = (from c in carMakers 
        where c.name == selectedCarMfgName 
        select c.id).SingleOrDefault(); 

您的查詢返回一個集合(帶有一個元素)。您應該使用Single()(或SingleOrDefault())來獲取該項目。如果查詢可以比一個結果返回更多,你應該看看First()(或FirstOrDefault()

0

我會稍微修改我的查詢:

var selCar = carMakers.Single(c => c.name == selectedCarMfgName).id; 

這是假設你知道汽車是在列表中。如果沒有,請使用SingleOrDefault並在獲得id之前檢查退貨。

0

我沒有做太多的LINQ,而是因爲你選擇成一個字符串,你可能需要使用FirstOrDefault爲您的語句可能返回回多個值但是你的字符串只能容納一個。

首先將返回空值,我覺得如果沒有找到,但FirstOrDefault將返回一個空字符串。

1

,請注意錯誤消息。它可能說像

"cannot implicitly convert IEnumerable<string> to string." 

序列的查詢的結果是另一個序列,IEnumerable<T>您可能知道只有一個結果,但這不是查詢所做的。要僅獲得一個結果,可以選擇在結尾包含另一個擴展方法。

yourQuery.First(); 
yourQuery.FirstOrDefault(); 
yourQuery.Single(); 
yourQuery.SingleOrDefault(); 

在這些不同的是,該變型First*可以與許多元素sequenes工作,而Single*變化將拋出異常,如果一個以上的元素存在。 *OrDefault變體支持匹配元素的概念,並返回該類型的默認值(類爲null時爲結構體的默認值(例如0代表int))。

使用符合您的期望版本。如果你希望一個只有一個比賽,更喜歡Single。如果你只關心任意多的一個,更喜歡First