2

Tuple<string,string,string,string>与えられた 3 つのアイテムで aのインデックスを取得する必要がありますがList、4 番目が何であるかは問題ではありません。元:

Listoftuples.IndexOf(new Tuple<string,string,string,string>("value1","value2","value3","this value does not matter"))

インデックスに関してワイルドカード文字はありますか、それとも別の方法がありますか?

4

3 に答える 3

6
int index = Listoftuples.FindIndex(t => t.Item1 == "value1" && t.Item2 == "value2" && t.Item3 == "value3");

述語を作成する関数を作成することができます。

Func<Tuple<string,string,string,string>, bool> CreateMatcher(string first, string second, string third)
{
    return t => t.Item1 == first && t.Item2 == second && t.Item3 == third;
}

その後、使用できます

int index = Listoftuples.FindIndex(CreateMatcher("value1", "value2", "value3"));
于 2013-01-15T20:57:29.487 に答える
2

それほど複雑ではありません。汎用のヘルパー メソッドを次に示します。

public static int IndexOf<TSource, TKey>(this IEnumerable<TSource> source, TKey key
    , Func<TSource, TKey> selector)
{
    int i = 0;
    foreach (var item in source)
    {
        if (object.Equals(selector(item), key))
            return i;
        i++;
    }

    return -1;
}

セレクターを受け取るメソッドができたので、次IndexOfのように簡単です。

list.IndexOf(Tuple.Create("value1", "value2", "value3")
    , item => Tuple.Create(item.Item1, item.Item2, item.Item3));

より一般的な目的にしたい場合はIComparer<TKey>、メソッドにオプションのパラメーターとして を追加できることに注意してください。IndexOf

于 2013-01-15T21:00:44.660 に答える
1

Oded の答えは (だった) 正しいですが、Linq にはリストベースのほぼすべてを実行する組み込みの方法があるため、独自の方法を作成する必要はありません。

var myElement = (Listoftuples.Select((x,i)=>new {Index = i, 
                          Element = Tuple.Create(x.Item1, x.Item2, x.Item3})
                      .FirstOrDefault(a=>a.Element == TupleToSearchFor);
var myIndex = myElement == null ? -1 : myElement.Index;
           

それを分解する:

  • 2 つのパラメーターを持つラムダを受け入れる Select() メソッドのオーバーロードがあります。ソースの列挙可能な要素の現在の要素と、ソースのその要素の「インデックス」 (元のリストの要素の順序を変更していないため、これは私たちにのみ機能することを理解してください。最初に並べ替えた場合、インデックスListoftuples と Select() に渡される要素との間で一致しません。

    次に、このメソッドを使用して匿名型の要素を生成します。これにより、2 つのことが行われます。まず、Tuple を 3 つの値の Tuple (各ソース Tuple の最初の 3 つであり、重要な要素です) に変更できます。次に、元の要素のインデックスを比較的簡単に「ボルトで固定」できます。後で参照するためのリスト。

  • FirstOrDefault() は、Tuple が検索対象の要素と一致する要素が見つかるまで、Select() 呼び出しの結果をスピンします (または、何も見つからない場合は null を返します)。

  • FirstOrDefault() は null を返す可能性があるため、確認する必要があります。それには多くの方法があります。私が入れた 3 項ステートメントは、単純で十分に理解できます。

最後に、myIndex は Listoftuples の最初に一致する要素のインデックス、または -1 を持ちます。これは、Listoftuples のどの要素も検索した要素と一致しないことを意味します。

于 2013-01-15T21:09:29.837 に答える