【解決方法】foreach を使用せずにリスト内の項目の条件を確認する


foreach を使用せずにリスト内の項目の条件を確認するにはどうすればよいですか。 たとえば、次のことを行う代わりに:

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

マイリストの項目に直接アクセスできます。 どうすればこれを達成できますか?

ありがとう!

解決策 4

まず、条件に一致するリスト内の最初の項目を見つける方法はありません。あるいは、 全て 条件を満たさずに一致するリスト内の項目 反復: Linq を使用すると、それが「自動化」されます。

ここで明確にしていただきたい質問は、正確には何ですか あなたが欲しい 文字列リストの反復から返されたもの:

1. ブール値に変換可能な文字列が含まれるリスト内のインデックスのリスト ?

2. または、リスト内の単なるブール値の束: インデックスがなければ、その用途を想像するのは困難です。

3. または、ブール値や文字列のリスト内のその値のインデックスに基づいてブール値に変換できる各文字列に対して何らかのアクションを実行します (何らかのコードを実行します)。 私の考えでは、より妥当な使用例です。

4. 他に明確にする必要があることについては、上記の投稿に対する私のコメントを参照してください。

ここでは、文字列のリストを Dictionary として返す例を示します。ここで、キーはリスト内のブール値のインデックス、値は変換されたブール値です。

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

ここでは、反復するコレクションのインデックスを作成/保存する Linq ‘Select のバリエーションが使用されていることに注意してください。インデックスと値の各ペアは、新しい匿名構造に射影されます。 次に、Where Linq ステートメントはそれらの「ペア」をフィルター処理して、文字列が ‘bool に変換できないペアはすべて破棄されます。 最後に、Linq ToDictionary を使用して、Where 句の ‘TryParse ステートメントによって ‘booltest に割り当てられたブール値を各 KeyValuePair の値として使用して、ディクショナリ構造を作成します。

解決策 2

コレクションを反復処理する必要があり、 foreach ループの場合、選択肢はそれほど多くありません。 for ループ。 こうやって(だと思います) mylist です 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]);
}

ブール値を取得するために文字列配列のリストを操作している理由がわかりません。 明らかに、より優れた/よりクリーンな実装が存在するはずです。

お役に立てれば。 幸運を。

解決策 3

つまり List<T>を使用できます 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");

解決策 5

奇跡などというものはありません。 ループを使用しない方法を使用する場合は、フードの後ろに何らかのループが使用されることを意味します。 しかし、多くの場合、そのような方法を使用することが完全に理にかなっています。 特に一般的なメソッドを参照してください。 System.Array.ForEach<>:

[^]。

-SA

解決策 6

匿名メソッドを改良したようなラムダ関数を使用すると、条件を読みやすくすることができます。

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

コメント

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