2012-08-27 78 views
0

當我execuse這些線路LINQ返回類型/值不是什麼即時通訊等待

drpdf["meno"] = matches.Cast<Match>().Where(c => c.Groups["ID"].Value == i.ToString()).Select(c => c.Groups["meno"].Value); 
drpdf["info"] = matches.Cast<Match>().Where(c => c.Groups["ID"].Value == i.ToString()).Select(c => Regex.Replace(c.Groups["zvysok"].Value, @"^,\s?", string.Empty)); 

它不會保存到我想要的DataRow值,而不是

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Text.RegularExpressions.Match,System.String] 

你能幫我請如何選擇/將返回值轉換爲可讀類型?不管怎麼說,還是要謝謝你。 Ondro

回答

1

你的LINQ查詢使用Select,所以你得到一個IEnumerable<T>回來。如果你希望你的LINQ查詢的結果,並且希望只有一個結果,加.Single()

drpdf["meno"] = matches.Cast<Match>() 
         .Where(c => c.Groups["ID"].Value == i.ToString()) 
         .Select(c => c.Groups["meno"].Value) 
         .Single(); 

在另一方面,如果你的查詢可以有多個結果,你應該使用.First(),而不是採取的第一個結果。然而,在這一點上,這取決於你的場景是什麼以及你想要捕捉什麼。

+0

大thx,我應該自己找出 –

0

喜歡的東西:

matches.Cast<Match>() 
     .Where(c => c.Groups["ID"].Value == i.ToString()) 
     .Select(c => c.Groups["meno"].Value) 
     .FirstOrDefault(); // this expression will evaluate the linq 
          // expression, so you get the string you want 

請注意:您應該只使用FirstOrDefault或如果的SingleOrDefault空實際上是在你的上下文的有效價值。 (就像@Daniel Hilgarth所說的那樣)。

如果null是不是一個有效的結果,而是你想要一個空字符串,追加?? String.Empty來表達:

matches 
    ... 
    .FirstOrDefault() ?? String.Empty; 
+0

請注意:如果您的上下文中「null」實際上是一個有效值,那麼您應該只使用'FirstOrDefault'或'SingleOrDefault'。 –

0

您的查詢的結果是可枚舉的對象。調用ToString()就不會像你已經注意到的那樣給你一個有意義的字符串表示。您需要生成適合顯示的字符串。

如果你只是想顯示的內容作爲一個逗號分隔的列表,你可以使用String.Join()做到這一點:

var menos = matches.Cast<Match>() 
        .Where(c => c.Groups["ID"].Value == i.ToString()) 
        .Select(c => c.Groups["meno"].Value); 
drpdf["meno"] = String.Join(", ", menos); 

否則,如果你打算選擇一個結果,用Single()來選擇單字符串結果。