c# - 查找字符串数组的哪个单元格包含文本的最佳方法

标签 c# arrays methods find gedcom

我有一段文本是从 Gedcom(HereHere)文件中提取的

文字是扁平的,基本上分成“节点”

我正在拆分\r 字符上的每个节点,从而将其分割为每个部分(“行”的数量可能会有所不同)

我知道 0 地址将始终是 ID 但在那之后一切都可以在任何地方所以我想测试数组的每个单元格以查看它是否包含我要处理的正确标签

两个节点的示例

0 @ind23815@ INDI <<<<<<<<<<<<<<<<<<< Start of node 1
1 NAME Lawrence /Hucstepe/
2 DISPLAY Lawrence Hucstepe
2 GIVN Lawrence
2 SURN Hucstepe
1 POSITION -850,-210
2 BOUNDARY_RECT (-887,-177),(-813,-257)
1 SEX M
1 BIRT 
2 DATE 1521
1 DEAT Y
2 DATE 1559
1 NOTE     * Born: Abt 1521, Kent, England
2 CONT     * Marriage: Jane Pope 17 Aug 1546, Kent, England
2 CONT     * Died: Bef 1559, Kent, England
2 CONT 
1 FAMS @fam08318@
0 @ind23816@ INDI  <<<<<<<<<<<<<<<<<<<<<<< Start of Node 2
1 NAME Jane /Pope/
2 DISPLAY Jane Pope
2 GIVN Jane
2 SURN Pope
1 POSITION -750,-210
2 BOUNDARY_RECT (-787,-177),(-713,-257)
1 SEX F
1 BIRT 
2 DATE 1525
1 DEAT Y
2 DATE 1609
1 NOTE     * Born: Abt 1525, Tenterden, Kent, England
2 CONT     * Marriage: Lawrence Hucstepe 17 Aug 1546, Kent, England
2 CONT     * Died: 23 Oct 1609
2 CONT 
1 FAMS @fam08318@
0 @ind23817@ INDI  <<<<<<<<<<< start of Node 3

所以当我完成时,我有一个看起来像的数组

address , string
0 = "1 NAME Lawrence /Hucstepe/"
1 = "2 DISPLAY Lawrence Hucstepe"
2 = "2 GIVN Lawrence"
3 = "2 SURN Hucstepe"
4 = "1 POSITION -850,-210"
5 = "2 BOUNDARY_RECT (-887,-177),(-813,-257)"
6 = "1 SEX M"
7 = "1 BIRT "
8 = "1 FAMS @fam08318@"

所以我的问题是搜索上述数组以查看哪个 Cell 具有 SEX 标签或 NAME 标签或 FAMS 标签的最佳方法是什么

这是我的代码

private int FindIndexinArray(string[] Arr, string search)
{
    int Val = -1;
    for (int i = 0; i < Arr.Length; i++)
    {
        if (Arr[i].Contains(search))
        {
            Val = i;
        }
    }
    return Val;
}

但它似乎效率低下,因为我最终调用它两次以确保它不会返回 -1

像这样

if (FindIndexinArray(SubNode, "1 BIRT ") != -1) { //将生日添加到 Struct I.BirthDay = SubNode[FindIndexinArray(SubNode, "1 BIRT ") + 1].Replace("2 DATE ", "").Trim(); }

抱歉,这是一个较长的帖子,但希望你们能得到一些专家的建议

最佳答案

可以使用Array类的静态方法FindAll: 如果可行的话,它会返回字符串本身。

string[] test = { "Sex", "Love", "Rock and Roll", "Drugs", "Computer"};
Array.FindAll(test, item => item.Contains("Sex") || item.Contains("Drugs") || item.Contains("Computer"));

=> 表示lamda 表达式。基本上是一种没有具体实现的方法。 如果 lamda 让您毛骨悚然,您也可以这样做。

//Declare a method 

     private bool HasTag(string s)
     {
         return s.Contains("Sex") || s.Contains("Drugs") || s.Contains("Computer");
     }

     string[] test = { "Sex", "Love", "Rock and Roll", "Drugs", "Computer"};
     Array.FindAll(test, HasTag);

关于c# - 查找字符串数组的哪个单元格包含文本的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/855901/

相关文章:

C# 等待并捕获异常

c# - Entity Framework 异常 : New transaction is not allowed because there are other threads running in the session

c# - 在 Windows 窗体应用程序中使用 google maps api

c# - 更改紧凑框架上的文件创建时间

arrays - 通用符合协议(protocol)数组

javascript - MDN "Object.is"替代提案

c# - C# 命名空间中的类、方法

python - 为什么以下简单的并行化代码比 Python 中的简单循环慢得多?

C - 读取字符数组中的 CSV 文件

java - 来自另一个类的 Getter 不适用于 ArrayList