Это не дает прямого ответа на ваш обобщенный вопрос, но в наиболее вероятном случае (или, по крайней мере, в случае, когда я искал ответ, когда натолкнулся на этот вопрос SO) где indexes
является единственным int
, этот метод расширения немного чище, чем возвращение массива string[]
, особенно в C # 7.
Что бы это ни стоило, я протестировал использование string.Substring()
против создания двух char[]
массивов, вызова text.CopyTo()
и возврата двух строк путем вызова new string(charArray)
. Использование string.Substring()
было примерно в два раза быстрее.
C # 7 синтаксис
пример jdoodle.com
public static class StringExtensions
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static (string left, string right) SplitAt(this string text, int index) =>
(text.Substring(0, index), text.Substring(index));
}
public static class Program
{
public static void Main()
{
var (left, right) = "leftright".SplitAt(4);
Console.WriteLine(left);
Console.WriteLine(right);
}
}
C # 6 синтаксис
jdoodle.com пример
Примечание. Использование Tuple<string, string>
в версиях, предшествующих C # 7, не сильно экономит многословие, и на самом деле может быть чище просто возвращать массив string[2]
.
public static class StringExtensions
{
// I'd use one or the other of these methods, and whichever one you choose,
// rename it to SplitAt()
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Tuple<string, string> TupleSplitAt(this string text, int index) =>
Tuple.Create<string, string>(text.Substring(0, index), text.Substring(index));
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string[] ArraySplitAt(this string text, int index) =>
new string[] { text.Substring(0, index), text.Substring(index) };
}
public static class Program
{
public static void Main()
{
Tuple<string, string> stringsTuple = "leftright".TupleSplitAt(4);
Console.WriteLine("Tuple method");
Console.WriteLine(stringsTuple.Item1);
Console.WriteLine(stringsTuple.Item2);
Console.WriteLine();
Console.WriteLine("Array method");
string[] stringsArray = "leftright".ArraySplitAt(4);
Console.WriteLine(stringsArray[0]);
Console.WriteLine(stringsArray[1]);
}
}