为什么在声明时可以像使用数据源一样使用Regex类

时间:2016-07-08 14:28:04

标签: regex linq

enter image description here

正如您在上图中所看到的,我可以在声明时使用Regex类作为数据源。那是为什么?

我也注意到这条LinQ线以点开头。这怎么可能?

1 个答案:

答案 0 :(得分:0)

Regex.Matches(string, string)会返回MatchCollection实例,该实例会实现ICollectionIEnumerable。因此,您无法直接使用LINQ,因为System.Linq.Enumerable中的LINQ扩展方法需要IEnumerable<T>(通用版本differences)。

这就是使用Enumerable.OfType的原因。这将返回IEnumerable<Match>,因此您现在可以使用LINQ。而不是OfType<Match>他也可以使用Cast<Match>

一般情况下,您可以将Linq-To-Objects用于实现IEnumerable<T>的任何类型,即使使用String也是如此,因为它实现了IEnumerable<char>。一个小例子,它创建了一个字典及其出现的字典:

Dictionary<char, int> charCounts = "Sample Text" // bad example because only unique letters but i hope you got it
  .GroupBy(c => c)
  .ToDictionary(g => g.Key, g => g.Count());

回答问题的.dot部分。 LINQ基本上由许多扩展方法组成,所以你也可以像任何其他方法一样调用它们,你可以使用一行:

Dictionary<char, int> charCounts = "Sample Text".GroupBy(c => c).ToDictionary(g => g.Key, g => g.Count());