c# - 给定从 0 开始的字符串绝对索引,确定从 1 开始的行号和列号(C#)
问题描述
在 C# 中,给定一个字符串和一个从 0 开始的索引值,我如何确定从 1 开始的行号和列号?
这应该适用于来自具有不同行尾约定的各种平台的字符串。
编辑:我发布了一个适用于各种场景且简洁的答案。我对其他答案持开放态度,这些答案可以使用具有不同行尾和行数的示例证明它们更快和/或正确。
解决方案
从您的问题的声音来看,您似乎想要一个类似于文本编辑器显示行号和列号的功能。尝试一下这个想法,看看下面的函数。您可以在目标索引之前提取一个子字符串,然后在换行符处拆分\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);
}
}
推荐阅读
- javascript - 如何为不同的选择选项值设置不同的位置
- angular - 如何单击所选项目然后导航到 p-dropdown 中的相应组件?
- domain-driven-design - 在域层中删除聚合操作
- python - 打印两个相邻的有换行符的字符串
- elasticsearch - 与一组标签不匹配的所有标签的 Elasticsearch 查询
- c - 结构内的指针
- python - 如何通过元组上的位置更改数据帧中的整数值?
- azure - 通过 IP 地址连接到 Azure Web App(使用应用服务环境)
- azure - 如何从 AzureDevOps Pipelines 访问 Azure VM?
- android - AdMob 匹配率低