首页 > 解决方案 > 给定从 0 开始的字符串绝对索引,确定从 1 开始的行号和列号(C#)

问题描述

在 C# 中,给定一个字符串和一个从 0 开始的索引值,我如何确定从 1 开始的行号和列号?

这应该适用于来自具有不同行尾约定的各种平台的字符串。

编辑:我发布了一个适用于各种场景且简洁的答案。我对其他答案持开放态度,这些答案可以使用具有不同行尾和行数的示例证明它们更快和/或正确。

标签: c#.net

解决方案


从您的问题的声音来看,您似乎想要一个类似于文本编辑器显示行号和列号的功能。尝试一下这个想法,看看下面的函数。您可以在目标索引之前提取一个子字符串,然后在换行符处拆分\n。行数是您的行号,因为子字符串仅包含直到目标索引的行。故意忽略拆分中的回车(\r)确保它们被计入索引并且对结果没有影响,从而确保跨平台兼容性。最后,最后一列的长度是行号,这也是因为子字符串在目标索引处结束。

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(FindIndexPair("Hello\r\nWorld", 0)); // (1, 1)
        Console.WriteLine(FindIndexPair("Hello\r\nWorld", 4)); // (1, 5)
        Console.WriteLine(FindIndexPair("Hello\r\nWorld", 7)); // (2, 1)
        Console.WriteLine(FindIndexPair("Hello\r\nWorld", 11)); // (2, 5)

        Console.WriteLine(FindIndexPair("Hello\nWorld", 0)); // (1, 1)
        Console.WriteLine(FindIndexPair("Hello\nWorld", 4)); // (1, 5)
        Console.WriteLine(FindIndexPair("Hello\nWorld", 6)); // (2, 1)
        Console.WriteLine(FindIndexPair("Hello\nWorld", 10)); // (2, 5)
    }

    public static Tuple<int, int> FindIndexPair(string val, int index)
    {
        var upToIndex = val.Substring(0, index + 1);
        var lines = upToIndex.Split('\n');
        var lineNumber = lines.Count();
        var columnNumber = lines.Last().Length;
        return Tuple.Create(lineNumber, columnNumber);
    }
}

推荐阅读