Tôi đã tập hợp một số mã được sửa đổi từ nhiều nguồn khác nhau sẽ nhận được kết quả bạn muốn và làm nhiều hơn thế nữa. Tôi đã cho phép các giá trị int âm, các giá trị int vượt quá độ dài của chuỗi và cho chỉ mục kết thúc nhỏ hơn chỉ mục bắt đầu. Trong trường hợp cuối cùng đó, phương thức trả về một chuỗi con thứ tự ngược. Có rất nhiều ý kiến, nhưng hãy cho tôi biết nếu có gì không rõ ràng hoặc chỉ là điên rồ. Tôi đã chơi xung quanh với điều này để xem tất cả những gì tôi có thể sử dụng nó cho.
/// <summary>
/// Returns characters slices from string between two indexes.
///
/// If start or end are negative, their indexes will be calculated counting
/// back from the end of the source string.
/// If the end param is less than the start param, the Slice will return a
/// substring in reverse order.
///
/// <param name="source">String the extension method will operate upon.</param>
/// <param name="startIndex">Starting index, may be negative.</param>
/// <param name="endIndex">Ending index, may be negative).</param>
/// </summary>
public static string Slice(this string source, int startIndex, int endIndex = int.MaxValue)
{
// If startIndex or endIndex exceeds the length of the string they will be set
// to zero if negative, or source.Length if positive.
if (source.ExceedsLength(startIndex)) startIndex = startIndex < 0 ? 0 : source.Length;
if (source.ExceedsLength(endIndex)) endIndex = endIndex < 0 ? 0 : source.Length;
// Negative values count back from the end of the source string.
if (startIndex < 0) startIndex = source.Length + startIndex;
if (endIndex < 0) endIndex = source.Length + endIndex;
// Calculate length of characters to slice from string.
int length = Math.Abs(endIndex - startIndex);
// If the endIndex is less than the startIndex, return a reversed substring.
if (endIndex < startIndex) return source.Substring(endIndex, length).Reverse();
return source.Substring(startIndex, length);
}
/// <summary>
/// Reverses character order in a string.
/// </summary>
/// <param name="source"></param>
/// <returns>string</returns>
public static string Reverse(this string source)
{
char[] charArray = source.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}
/// <summary>
/// Verifies that the index is within the range of the string source.
/// </summary>
/// <param name="source"></param>
/// <param name="index"></param>
/// <returns>bool</returns>
public static bool ExceedsLength(this string source, int index)
{
return Math.Abs(index) > source.Length ? true : false;
}
Vì vậy, nếu bạn có một chuỗi như "Đây là một phương thức mở rộng", đây là một số ví dụ và kết quả mong đợi.
var s = "This is an extension method";
// If you want to slice off end characters, just supply a negative startIndex value
// but no endIndex value (or an endIndex value >= to the source string length).
Console.WriteLine(s.Slice(-5));
// Returns "ethod".
Console.WriteLine(s.Slice(-5, 10));
// Results in a startIndex of 22 (counting 5 back from the end).
// Since that is greater than the endIndex of 10, the result is reversed.
// Returns "m noisnetxe"
Console.WriteLine(s.Slice(2, 15));
// Returns "is is an exte"
Hy vọng phiên bản này hữu ích cho ai đó. Nó hoạt động giống như bình thường nếu bạn không sử dụng bất kỳ số âm nào và cung cấp mặc định cho các thông số ngoài phạm vi.