如何使用Func<>?创建linq扩展方法

时间:2015-02-10 03:03:43

标签: c# .net

我已经创建了可以像这样使用的扩展方法:

string returnValue = numbers.At(separator, index).Slice();

但我想这样创作:

string returnValue = numbers.At(s => '.').Slice();

这是其他代码。

 public class StringParameters
 {
     public string Text { get; set; }
     public int Position { get; set; }

     public StringParameters(string text, int position)
     {
         this.Text = text;
         this.Position = position;
     }
 }

 public static StringParameters At(this string text, char c)
 {
     int index = text.IndexOf(c);
     if (index > 0)
     {
         int index2 = text.IndexOf(c, index + 1);
         if (index2 > index)
         {
             text = text.Substring(index2, text.Length - index2);
         }

         return new StringParameters(text, index2 + 1);
     }

     return new StringParameters(null, -1);
 }

 public static string Slice(this StringParameters parameters)
 {
     return parameters.Text.Substring(parameters.Position);
 }

编辑:我已经编辑了代码,并将“替换为......”。我还没有完全了解它应该在那里。我的期望是这个方法应该更有用。

编辑2:我现在知道我想用我的代码创建什么。我希望能够做出这样的事情:

string returnValue = numbers.At(s, i => GetStringParameter()).Slice();

编辑3:我已经编辑了一点代码。现在我想要实现的目标可能会更加清晰。

编辑4:更正了上述代码中的错误。

3 个答案:

答案 0 :(得分:1)

我想你想要

string returnValue = numbers.At(s, i => GetStringParameter()).Slice();

Slice扩展方法具有签名:

 public static string Slice(this StringParameters parameters)

即。你想要

 StringParameters stringParameters = numbers.At(s, i => GetStringParameter());
 string returnValue = stringParameters.Slice();

听起来您需要对您的扩展方法At重载,以获得如下签名:

public static StringParameters At(this string text, S s, Func<T, U> func)

S是您传入的s的类型,T是您Func的输入,而U是Func的输出类型。

At方法中,您可以使用Func,就像调用方法一样,例如

Func<int, string> func = (int)i => i.ToString();
string s = func(123); // s == "123"

答案 1 :(得分:1)

我不清楚你想要实现什么(start参数,你想用函数替换它,不在At函数中的任何地方使用),但这是一个示例扩展函数与Func&lt;&gt;参数:

public static StringParameters At(this string text, char c, Func<int> startFunc)
{
    int start = startFunc();
    int index = text.IndexOf(c);
    if (index > 0)
    {
        int index2 = text.IndexOf(c, index + 1);
        if (index2 > index)
        {
            text = text.Substring(0, text.Length - index2);
        }

        return new StringParameters(text, index2 + 1);
    }

    return new StringParameters(null, -1);
}

用法:

string returnValue = numbers.At(s, () => GetStartIndex()).Slice();

在您有一个参数传递给i => Func<>函数内部之前,您不需要At

当您致电int start = startFunc();时,您将作为参数传递给At(我的示例中为GetStartIndex())的函数将被调用,其返回值将设置为{{1}变量。

答案 2 :(得分:0)

我终于在Aleksey Shubin和其他人的帮助下找到了解决方案。最终代码如下所示:

public static class Linq
{
    public class StringParameters
    {
        public string Text { get; set; }
        public int Position { get; set; }

        public StringParameters(string text, int position)
        {
            this.Text = text;
            this.Position = position;
        }
    }

    public static StringParameters At(this string text, Func<char> func)
    {
        char c = func();
        int index = text.IndexOf(c);
        if (index > 0)
        {
            int index2 = text.IndexOf(c, index + 1);
            if (index2 > index)
            {
                text = text.Substring(index2, text.Length - index2);
            }

            return new StringParameters(text, index2 + 1);
        }

        return new StringParameters(null, -1);
    }

   public static string Cut(this StringParameters parameters)
   {
       return parameters.Text.Substring(parameters.Position);
   }
}

可以这样使用:

string returnValue = "132.465..646.656.45".At(() => '.').Cut();

返回6.45的值。它应该返回值656.45或者可能是132.465,但这很容易。谢谢大家的帮助。