Verificar una condición en un elemento en una lista sin foreach

programación


¿Cómo puedo verificar una condición en un elemento de una lista sin usar foreach? Por ejemplo, en lugar de tener que hacer:

C#
foreach(string[] item in mylist)
{
  if(Convert.ToBoolean(item[0]){}
}

Puedo acceder directamente al elemento de mylist. ¿Cómo puedo conseguir esto?

¡Gracias!

Solución 4

En primer lugar, no hay forma de localizar el primer elemento de una lista que coincida con una condición, o, todo elementos en una Lista que coinciden con alguna condición sin iteración: usar Linq simplemente lo “automatizará” por usted.

La pregunta que debes aclarar aquí es qué es exactamente quieres devuelto de su iteración de una lista de cadenas:

1. ¿una lista de índices en la lista donde están las cadenas convertibles a valores booleanos?

2. o simplemente un montón de valores booleanos en una lista: sin los índices, es difícil imaginar un uso para eso.

3. ¿O tomar alguna acción (ejecutar algún código) para cada cadena que se puede convertir a booleanos en función del valor booleano y/o el índice de ese valor en la lista de cadenas? En mi humilde opinión, un caso de uso más plausible.

4. Mira mi comentario en tu publicación anterior para saber qué más necesitas aclarar.

Aquí le mostraré un ejemplo de cómo devolver la lista de cadenas como Diccionario… donde la clave es el índice del valor booleano en la lista y el valor es el valor booleano convertido.

C#
// required
using System.Linq

// assume the data source here is a simple List<string>
List<string> strList = new List<string>
{
    "True", "what", "False", "True", "ozone", "False"
};

// this variable must be initialized to be used in the Linq shown here
bool booltest = false;

Dictionary<int,bool> dctIntBool = strList
.Select((str, index) => new {index, str})
.Where(pair => Boolean.TryParse(pair.str, out booltest))
.ToDictionary(pair => pair.index, pair => booltest);

Tenga en cuenta que aquí se utiliza la variación de Linq ‘Select que crea/preserva un índice de la colección que itera: cada par de índice/valor se proyecta en una nueva estructura anónima; luego, la instrucción Where Linq filtra esos “pares” de modo que cualquier par donde la cadena no sea convertible a ‘bool se descarta; finalmente, Linq ToDictionary se usa para crear la estructura del Diccionario, usando, para el Valor de cada KeyValuePair, el valor booleano asignado a ‘booltest por la instrucción ‘TryParse en la cláusula Where.

Solución 2

Si desea iterar sobre una colección y no desea utilizar el foreach bucle, no tienes muchas más opciones que un for bucle. De esta manera (supongo mylist es un IList):

C#
int count = mylist.Count;
string[] result; // This assumes you have an IList<string[]>
for (int i = 0; i < count; i++)
{
   result = mylist[i];
   bool value = Convert.ToBoolean(result[0]);
}

No veo la razón por la que estás trabajando con una lista de matrices de cadenas para obtener un valor booleano. Obviamente debe haber una implementación mejor/más limpia.

Espero que esto ayude. Buena suerte.

Solución 3

Si te refieres a List<T>puedes utilizar Lista.Contiene método[^].

C#
List<string> mylist = new List<string>(){"cat","dog","bird"};

var result = mylist.Contains("bird");
Console.WriteLine("A list {0} 'bird' word", result==true ? "contains" : "does not contain");

Solución 5

No existe el milagro. Si utiliza algún método sin bucle, significa que se utiliza algún bucle detrás del capó. Pero a menudo tiene mucho sentido utilizar estos métodos. Ver, en particular, método genérico. System.Array.ForEach<>:

[^].

-SA

Solución 6

Podrías usar una función lambda, que es como mejorar los métodos anónimos, que hace que la condición sea más fácil de leer:

bool exists = myList.Any(x => Convert.ToBoolean(x) == true);
if (exists) {
    // Do something
}

コメント

タイトルとURLをコピーしました