考虑这段代码:
public static class MatchCollectionExtensions
{
public static IEnumerable<T> AsEnumerable<T>(this MatchCollection mc)
{
return new T[mc.Count];
}
}
这节课:
public class Ingredient
{
public String Name { get; set; }
}
有没有办法将MatchCollection
对象神奇地转换为Ingredient
的集合?用例看起来像这样:
var matches = new Regex("([a-z])+,?").Matches("tomato,potato,carrot");
var ingredients = matches.AsEnumerable<Ingredient>();
的更新
纯粹的基于LINQ的解决方案也足够了。
答案 0 :(得分:4)
只有在您有某种方法将匹配转换为成分时。由于没有通用的方法来执行此操作,您可能需要为您的方法提供一些帮助。例如,您的方法可以使用Func<Match, Ingredient>
来执行映射:
public static IEnumerable<T> AsEnumerable<T>(this MatchCollection mc, Func<Match, T> maker)
{
foreach (Match m in mc)
yield return maker(m);
}
然后你可以按如下方式调用它:
var ingredients = matches.AsEnumerable<Ingredient>(m => new Ingredient { Name = m.Value });
您也可以绕过创建自己的方法,只需使用Select,使用Cast运算符来处理MatchCollection的弱类型:
var ingredients = matches.Cast<Match>()
.Select(m => new Ingredient { Name = m.Value });
答案 1 :(得分:2)
尝试这样的事情(使用System.Linq
命名空间):
public class Ingredient
{
public string Name { get; set; }
}
public static class MatchCollectionExtensions
{
public static IEnumerable<T> AsEnumerable<T>(this MatchCollection mc, Func<Match, T> converter)
{
return (mc).Cast<Match>().Select(converter).ToList();
}
}
可以像这样使用:
var matches = new Regex("([a-z])+,?").Matches("tomato,potato,carrot");
var ingredients = matches.AsEnumerable<Ingredient>(match => new Ingredient { Name = match.Value });
答案 2 :(得分:2)
你可以先施展它......
matches.Cast<Match>()
...然后使用LINQ转换结果IEnumerable<Match>
。