我已经创建了可以像这样使用的扩展方法:
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:更正了上述代码中的错误。
答案 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,但这很容易。谢谢大家的帮助。