2010-04-16 69 views
4

考慮以下代碼片段:通用擴展方法返回的IEnumerable <T>不使用反射

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基礎的解決方案就足夠了爲好。

回答

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

您也可以跳過創建自己的方法,只使用選擇,與演員操作員處理MatchCollection的弱類型:

var ingredients = matches.Cast<Match>() 
         .Select(m => new Ingredient { Name = m.Value }); 
+0

選項#2工作。謝謝 :) – roosteronacid 2010-04-16 08:35:57

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

你可以先投它...

matches.Cast<Match>() 

...然後轉換結果IEnumerable<Match>但是你想要使用LINQ。

相關問題