1

重複の可能性:
IEnumerableの要素のインデックスを取得するにはどうすればよいですか?

私は、無数の文字列リストを受け入れるこの次の関数を持っています。

すべての文字列をループし、その値が " TestName"(大文字と小文字を区別しない)に等しい場合は、その位置を返します。

    int GetMyTestColumnPosition(IEnumerable<string> TitleNames)
    {
        foreach (var test in TitleNames)
        {
            if (string.Compare(test, "testname", stringComparison.CurrentCultureIgnoreCase) == 0)
            {
                // return TitleNames.IndexOf(test); does not work!
            }
        }
    } 

編集:パラメータを「IList<string>」に変更しました。これで動作します。だが、

  1. 無数の文字列リスト内で文字列のインデックスまたは位置を見つける方法は?
  2. ienumerableがインデックスをサポートしないのはなぜですか?(リスト内の値は変更していません。位置を確認しているだけです!)
4

5 に答える 5

5

IEnumerablesは列挙に使用されるため、IndexOfメソッドがないことはそれほど驚くことではありません。必要に応じて、拡張メソッドを作成できます。

ただし、すでに列挙しているので、インデックスを再度計算する意味は何ですか?このようなことをします:

int index = 0;
foreach(var test in TitleNames)
{
    if(...) return index;
    index++;
}

考えてみると、これあなたが望む拡張方法です:

public static int IndexOf(this IEnumerable<T> list, T item)
{
    int index = 0;
    foreach(var l in list)
    {
        if(l.Equals(item))
            return index;
        index++;
    }
    return -1;
 }

nullのチェックを追加することを忘れないでください。また、オプションの比較子を提供することもできます。

于 2013-01-15T10:45:36.910 に答える
5

オーバーロードのインデックスをSelectまたはに渡すことができますWhere

var found = TitleNames
    .Select((str, index) => new { str, index })
    .Where(x => x.str.Equals("testname", StringComparison.CurrentCultureIgnoreCase))
    .FirstOrDefault();

if (found != null)
    return found.index;
return -1;
于 2013-01-15T10:45:53.787 に答える
3

IListについてのMSDNから

インデックスによって個別にアクセスできるオブジェクトの非ジェネリックコレクションを表します。

IEnumerableは単純な列挙子であり、インデックスをサポートしていません。

于 2013-01-15T10:45:33.567 に答える
0
var item = 
    TitleNames.Select( (tn, index) => new{tn, index})
      .FirstOrDefault(x => 
        string.Equals(x.tn, 
                      "testname", 
                      StringComparison.CurrentCultureIgnoreCase));
return item==null ? -1 : item.index;
于 2013-01-15T10:47:59.230 に答える
0

TitleNamesであるIEnumerableため、インデックスをサポートしていません。

列挙に頼ることはできません:

int i = 0;
foreach(var test in TitleNames)
{
    i++;
}

インデックスを計算します。

列挙時にオブジェクトをランダムな順序で継承しIEnumerable<T>、返す独自のクラスを作成できます。

ほとんどの具体的な.Netタイプが一般的にインデックスに適している場合、それは純粋な実装の詳細です。

だから、あなたの質問に答えるために:あなたはからオブジェクトのインデックスを取得することはできませんIEnumerable<T>IList<T>インデックスのサポートが必要な場合に使用します。

于 2013-01-15T10:51:27.510 に答える