请考虑下面这段代码:

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 });

10-06 16:21