代码之家  ›  专栏  ›  技术社区  ›  Lucas Freitas

泛型linq上的Func<TIn,TResult>

  •  0
  • Lucas Freitas  · 技术社区  · 6 年前

    List<string> myData = new List<string>
                {
                    "abcdefghi1",
                    "abcdefghi2"
                    "abcdefghi3"
                };
    

    如果我手动创建下面的LINQ,它就可以完美地工作。

    var myObjectList = (from s in myData 
                        select new myObject
                        {
                            Prop1 = s.Substring(0,3),
                            Prop2 = s.Substring(4,1)...
                        }).ToList();
    

    当我选中“selectnewmyobject”类型时,它是一个 Func<string, T> .

    List<T> getMyObjects(List<string> myData, Func<string, T> selector) where T : class 
    {
        return (from s in myData select selector).ToList();
    }
    

    就这样说吧

    var myObjectList = getMyObjects(data, 
                          value => new myObject 
                          {
                            Prop1 = value.Substring(0,3),
                            Prop2 = value.Substring(4,1)
                          });
    

    它返回一个 {System.Func<string, MyObject>}

    你知道怎么做吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jonathon Chase    6 年前

    您选择的是映射函数,而不是使用它进行映射的结果。

    List<T> getMyObjects(List<string> myData, Func<string, T> selector) where T : class 
    {
        return (from s in myData select selector).ToList();
    }
    

    应该是的

    List<T> getMyObjects(List<string> myData, Func<string, T> selector) where T : class 
    {
        return (from s in myData select selector(s)).ToList();
        //                                      ^^^ get the result of your selector delegate against the string.
    }
    

    正如@Camilo Terevinto所指出的,可以进一步简化为:

    List<T> getMyObjects(List<string> myData, Func<string, T> selector) where T : class 
    {
        return myData.Select(selector).ToList();
    }