2010-04-06 15 views
19

Estoy leyendo una lista de cadenas delimitada por comas de un archivo de configuración. Necesito comprobar si hay otra cadena en esa lista. Por ejemplo:¿La mejor manera de verificar la cadena en la lista delimitada por comas con .NET?

"apple,banana,cheese"

Si puedo comprobar si hay "apple" que debe encontrarlo, pero si puedo comprobar si hay "app" que no debería.

¿Cuál es la forma más directa y concisa de hacer esto? No tiene que ser rápido.

(Voy a añadir mi solución como una respuesta, pero estoy esperando que alguien tiene algo mejor.)

Respuesta

37

mediante LINQ:

listString.Split(',').Contains("apple") 

W/O LINQ:

Array.IndexOf(listString.Split(','), "apple") >= 0 
+1

No lo entiendo String.Split devuelve una matriz. Las matrices no tienen un método Contiene. –

+2

debe estar usando .NET3.5 +, y tener 'using System.Linq' en alguna parte. – nothrow

+1

Hay un método de extensión LINQ 'Contains' que se puede usar para una matriz. Aunque esto no funcionaría si usa .Net 1.1 o 2.0. –

7

expresión regular, probablemente, no cuenta como "recta hacia adelante", pero esto es lo que yo ¡Lo tengo:

Regex.IsMatch(listString, "(?<=,|^)" + testWord + "(?=,|$)") 

actualización: el comentario de por Eric adelante, esto debería ser:

Regex.IsMatch(listString, "(?<=,|^)" + Regex.Escape(testWord) + "(?=,|$)") 
+3

Por supuesto, si Testword contiene cualquier símbolos que tienen significado en una expresión regular entonces tienes un gran problema aquí. –

+1

Whoah, no pensé en eso. ¡Buen punto! ¡Supongo que soy vulnerable a un ataque de inyección de regex! :) –

+0

¿Qué quieres decir? Regexes rock! –

10
(","+listString+",").Contains(","+testWord+","); 

pero no directo, también.

+1

Solía ​​usar este método todo el tiempo. Tiene la virtud de no crear N nuevas cadenas. – harpo

+3

Si su cadena separada por comas es larga, esto es más eficiente en el uso del espacio que la división. –

+1

Para .NET 2.0, creo que esta puede ser la mejor solución. No es demasiado difícil ver por qué se agregan las comas, y es solo una llamada al método. Me gusta. –

3

Otra forma podría ser la de tratar de usar

bool contains = new List<string>("apple,banana,cheese".Split(',')).Contains("apple"); 
//or 
bool b = "apple,banana,cheese".Split(',').Contains("apple"); 

List< T>.Contains Method

String.Split Method

Enumerable.Contains Method

+0

Gracias por incluir la versión que no es Linq. Lástima que es tan detallado. –

+3

Dado que Array implementa IList , no necesita crear una segunda lista . La siguiente variante funcionará para .NET 2.0: ((IList ) listString.Split (',')). Contiene (...) – Joe

1

Aquí es una opción que no hace distinción alguna.

var food = "apple,banana,cheese"; 

bool containsApp = food.Split(',') 
         .Where(s => string.Compare("app", s, true) == 0) 
         .Count() > 0; 

bool containsApple = food.Split(',') 
         .Where(s => string.Compare("apple", s, true) == 0) 
         .Count() > 0; 

Console.WriteLine("Contains \"app\"? {0}", containsApp); 
Console.WriteLine("Contains \"apple\"? {0}", containsApple); 
+0

Si está utilizando linq, 'IEnumerable .Compare' tiene una sobrecarga que toma un 'IEqualityComparer '. – Lee

+0

+1 para las comparaciones de cuerdas con sensibilidad cultural! "Caf \ u00E9" y "Cafe \ u0301" parecen idénticos, ¡deben ser iguales! –

1

La respuesta depende de las reglas de sintaxis para su lista delimitada por comas.

Si las reglas requieren que la lista sea exactamente como usted envió (sin espacios, no se arrastra por comas), entonces la tarea puede ser dividido en piezas componentes es:

¿La cadena de comenzar con apple,? (String.StartsWith)
¿La cadena termina con ,apple? (String.EndsWith)
¿La cadena contiene ,apple,? (String.Contains)

Si las reglas son más difíciles, el enfoque Regex se convierte en la única forma sin procesar por completo la lista o escribir un montón de reglas.

Si está buscando muchos artículos en la misma cadena, querrá simplemente transformar la cadena en una lista que almacena en caché y luego compara. El método String.Split hará esto por usted.

2

Esto funciona, pero las expresiones regulares son bastante lentas si se vuelven complicadas. Dicho esto, la palabra delimitador de límites hace que este tipo de cosas sea bastante fácil.

var foods = "apple,banana,cheese"; 

var match = Regex.Match(foods, @"\bapple\b"); 

if (match.Success) 
    Console.WriteLine(match.Value); 
+1

Oh, eso hace que mi solución de look-ahead complicado parezca realmente tonta. Gracias. –

0

Esta es la solución para ignorar caso y la cultura (o seleccione una de la propiedad de StringComparer)

var commaDelimitedString = "string1,string2,string3,string4"; 
var testString = string2.trim; // trim to remove the spaces coz you may be getting it from UI 
if(commaDelimitedString.split(',').contains(testString,StringComparer.InvariantCultureIgnoreCase)) 
{ 
    //TODO: What to do when condition is true 
} 
else 
{ 
    //TODO: What to do when condition is false 
} 
0
    public bool GetIsExistSubstring(string mainstring, string substring) 
    {   
     bool Isexist=false; 
     int i = -1; 
     mainstring = string.Format(",{0},", mainstring);//so it will be like ,1,2,3, 
     substring = string.Format(",{0},", substring);//so it will be like ,1, 
     i=mainstring.IndexOf(substring); 

     if(i!=-1) 
     { 
      Isexist = true; 
     } 
     return Isexist; 
    } 
+0

Intente responder nuevas preguntas. Esto fue solicitado en 2010 y también fue respondido. –

Cuestiones relacionadas