أفضل طريقة للعثور على أي خلية من صفيف سلسلة تحتوي على النص

StackOverflow https://stackoverflow.com/questions/855901

سؤال

ولدي كتلة من النص أن ايم أخذ من GEDCOM ( هنا و <ل أ href = "https://stackoverflow.com/questions/836146/gedcom-reader-for-c"> هنا ) ملف

وهذا النص هو ثابت وكسر في الأساس إلى "العقد"

وأنا تقسيم كل عقدة على شار \ r و بالتالي يقسمها إلى كل من أجزائه (مبلغ "خطوط" يمكن أن تختلف)

وأنا أعلم أن عنوان 0 يكون دائما هو معرف ولكن بعد أن كل شيء يمكن أن يكون في أي مكان حتى أريد أن اختبار كل خلية من مجموعة لمعرفة ما إذا كان يحتوي على علامة الصحيحة بالنسبة لي أن نعالج

مثال على ما عقدتين ستبدو

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

So a when im done i have an array that looks like

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@"

So my question is what is the best way to search the above array to see which Cell has the SEX tag or the NAME Tag or the FAMS Tag

this is the code i have

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;
}

But it seems inefficient because i end up calling it twice to make sure it doesnt return a -1

Like so

if (FindIndexinArray(SubNode, "1 BIRT ") != -1) { // add birthday to Struct I.BirthDay = SubNode[FindIndexinArray(SubNode, "1 BIRT ") + 1].Replace("2 DATE ", "").Trim(); }

وآسف هذه هي وظيفة أطول ولكن نأمل يا رفاق سيكون لها بعض مشورة الخبراء

هل كانت مفيدة؟

المحلول

ويمكن استخدام 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);

نصائح أخرى

وماذا عن العادية التعبير ؟

^(\d)\s=\s\"\d\s(SEX|BIRT|FAMS){1}.*$

ومجموعة الأولى يلتقط العنوان، المجموعة الثانية العلامة.

وبالإضافة إلى ذلك، قد يكون أسرع لتفريغ جميع البنود مجموعة إلى سلسلة والقيام باستخدام التعابير المنطقية الخاصة بك على الكثير كله في وقت واحد.

<اقتباس فقرة>   

واضاف "لكن على ما يبدو غير فعال لأنني في نهاية المطاف اصفا إياه مرتين للتأكد من أنها لا ترجع -1"

ونسخ القيمة التي تم إرجاعها إلى متغير قبل اختبار لمنع المكالمات متعددة.

IndexResults = FindIndexinArray(SubNode, "1 BIRT ")
if (IndexResults != -1)
        {
            // add birthday to Struct 
            I.BirthDay = SubNode[IndexResults].Replace("2 DATE ", "").Trim();
        }

ووللحلقة في طريقة FindIndexinArray التنمية البشرية المستدامة كسر بمجرد العثور على تطابق إذا كنت مهتما فقط في المباراة الأولى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top