Mejor manera de encontrar qué célula de matriz de cadenas contiene texto
Pregunta
Tengo un bloque de texto que im tomando de un Gedcom ( Aquí y Aquí ) archivo
El texto es plana y básicamente roto en "nodos"
Estoy dividiendo cada nodo de la \ r carbón y por lo tanto subdividirlo en cada una de sus partes (cantidad de "líneas" puede variar)
Sé que la dirección 0 será siempre el ID pero después de que todo puede estar en cualquier lugar, así que quiero probar cada celda de la matriz para ver si contiene la etiqueta correcta para mí Proccess
Un ejemplo de lo dos nodos se vería
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
Así que cuando un im hecho tengo una matriz que se parece a
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@"
Así que mi pregunta es ¿cuál es la mejor manera de buscar la matriz de arriba para ver qué célula tiene la etiqueta sexo o la etiqueta de nombre o la etiqueta de FAMS
este es el código que tengo
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; }
Pero parece ineficaz porque me acaban de llamar dos veces para asegurarse de que es imposible devolver un -1
Al igual que
if (FindIndexinArray(SubNode, "1 BIRT ") != -1) { // add birthday to Struct I.BirthDay = SubNode[FindIndexinArray(SubNode, "1 BIRT ") + 1].Replace("2 DATE ", "").Trim(); }
lo siento esto es un post largo, pero espero que ustedes tendrá algunos consejos de expertos
Solución
Puede utilizar el método FindAll estático de la clase Array: Se devolverá la cadena en sí, aunque, si funciona ..
string[] test = { "Sex", "Love", "Rock and Roll", "Drugs", "Computer"};
Array.FindAll(test, item => item.Contains("Sex") || item.Contains("Drugs") || item.Contains("Computer"));
El => indica una expresión lambda. Básicamente, un método sin una aplicación concreta. También puede hacer esto si el lambda que da escalofríos.
//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);
Otros consejos
¿Qué pasa con un simple expresión regular ?
^(\d)\s=\s\"\d\s(SEX|BIRT|FAMS){1}.*$
Primer grupo captura la dirección, segundo grupo la etiqueta.
Además, puede ser que sea más rápido para volcar todos los elementos de matriz en una cadena y hacer su expresión regular en todo el lote a la vez.
"Pero parece ineficaz porque me acaban de llamar dos veces para asegurarse de que es imposible devolver un -1"
Copia el valor devuelto a una variable antes de probar para evitar múltiples llamadas.
IndexResults = FindIndexinArray(SubNode, "1 BIRT ")
if (IndexResults != -1)
{
// add birthday to Struct
I.BirthDay = SubNode[IndexResults].Replace("2 DATE ", "").Trim();
}
El bucle en el método FindIndexinArray SHD romper una vez que encuentre una coincidencia si usted está interesado sólo en el primer partido.