Vérifier une condition sur un élément d’une liste sans foreach

la programmation


Comment puis-je vérifier une condition sur un élément d’une liste sans utiliser foreach. Par exemple, au lieu de devoir faire :

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

Je peux simplement accéder directement à l’élément de ma liste. Comment puis-je atteindre cet objectif?

Merci!

Solution 4

Premièrement, il est impossible de localiser le premier élément d’une liste qui correspond à une condition, ou, tous éléments d’une liste qui correspondent à certaines conditions sans itération: utiliser Linq va simplement “automatiser” cela pour vous.

La question que vous devez clarifier ici est de savoir quoi exactement tu veux renvoyé par votre itération d’une liste de chaînes :

1. une liste d’index dans la liste où se trouvent les chaînes convertibles en valeurs booléennes ?

2. ou, juste un tas de valeurs booléennes dans une liste : sans les index, difficile d’imaginer une utilisation pour cela.

3. ou, pour entreprendre une action (exécuter du code) pour chaque chaîne pouvant être convertie en booléens en fonction de la valeur booléenne et/ou de l’index de cette valeur dans la liste des chaînes ? à mon humble avis, un cas d’utilisation plus plausible.

4. voir mon commentaire sur votre message ci-dessus pour savoir ce que vous devez clarifier d’autre

Je vais vous montrer ici un exemple de renvoi de la liste de chaînes sous forme de Dictionary … où la clé est l’index de la valeur booléenne dans la liste et la valeur est la valeur booléenne convertie.

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

Notez que la variante de Linq ‘Select qui crée/préserve un index de la collection qu’elle itère est utilisée ici : chaque paire index/valeur est projetée dans une nouvelle structure anonyme ; ensuite, l’instruction Where Linq filtre ces “paires” afin que toute paire dont la chaîne n’est pas convertible en “bool” soit rejetée ; enfin, Linq ToDictionary est utilisé pour créer la structure du dictionnaire, en utilisant, pour la valeur de chaque KeyValuePair, la valeur booléenne attribuée à ‘booltest par l’instruction ‘TryParse dans la clause Where.

Solution 2

Si vous souhaitez parcourir une collection et ne souhaitez pas utiliser le foreach boucle, vous n’avez pas beaucoup plus de choix qu’un for boucle. De cette façon (je suppose mylist est 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]);
}

Je ne vois pas la raison pour laquelle vous travaillez avec une liste de tableaux de chaînes pour obtenir un booléen. Il doit évidemment y avoir une mise en œuvre meilleure/plus propre.

J’espère que cela t’aides. Bonne chance.

Solution 3

Si tu veux dire List<T>vous pouvez utiliser Méthode List.Contains[^].

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");

Solution 5

Il n’y a pas de miracle. Si vous utilisez une méthode sans boucle, cela signifie qu’une boucle est utilisée derrière le capot. Mais il est souvent tout à fait logique d’utiliser de telles méthodes. Voir notamment méthode générique System.Array.ForEach<>:

[^].

-SA

Solution 6

Vous pouvez utiliser une fonction lambda, qui ressemble à des méthodes anonymes améliorées, qui rend la condition plus facile à lire :

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

コメント

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