0

当我执行这些行时

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]

你能帮我请教如何选择/将返回值转换为可读类型吗?不管怎么说,还是要谢谢你。翁德罗

4

3 回答 3

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()改为使用第一个结果。然而,到那时,这取决于你的场景是什么以及你想要捕捉什么。

于 2012-08-27T14:04:18.477 回答
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

请注意:如果 null 在您的上下文中实际上是一个有效值,您应该只使用 FirstOrDefault 或 SingleOrDefault。(就像@Daniel Hilgarth 所说的那样)。

如果null不是有效结果,而您想要一个空字符串,请将 a 附加?? String.Empty到表达式:

matches
  ...
  .FirstOrDefault() ?? String.Empty;
于 2012-08-27T14:06:43.363 回答
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()选择该单个字符串结果。

于 2012-08-27T14:07:36.160 回答