请考虑下面这段代码:
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的解决方案也足够了。
最佳答案
只有当你有办法把火柴变成配料的时候。因为没有一种通用的方法可以做到这一点,所以您可能需要为您的方法提供一些帮助。例如,您的方法可以使用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 });