1

私は2つのリストを持っています:

List1 has values like: "A, A, A, A, B, B, B, B, C, C, C, C, C... so on
List2 has values like: "0, 1, 2, 2, 1.1, 1.2, 1.3, 4, 4, 4, 4.... so on

List1 のインデックスを B と言って、List2 で対応する値を見つけたいとします。私がやっていることは、値がBであるList1の開始インデックスと終了インデックスを取得することです。これらのインデックスのlist2をループして値を取得するよりも。これはあまりにも多くの作業と多くのオーバーヘッドのようです。linq を使用してこれを行うより良い方法はありますか?

私はこれを使用しました: varlist1Values = list1.FindAll(x => x.Contains("B"));これにより、B からの値が得られます。findAll として、インデックスを与えることさえありません。1つの考えは、list1Valuesのインデックスをループしてlist2の値を取得することですが、それが正しい方法だとは思わないでください。

4

1 に答える 1

1

両方のリストの長さが同じであればZip、両方のシーケンスから対応するアイテムをペアにするために使用できます。

var target = "B";
var result = list1.Zip(list2, (x,y) => Tuple.Create(x,y))
                  .Where(o => o.Item1 == target);

foreach(var item in result)
{
    Console.WriteLine(item.Item2);
}

を使用したTupleのでItem1、 からの手紙list1Item2は の対応するアイテムですlist2。もちろん、匿名型を使用して、より意味のある名前を付けることもできます。

更新:質問に C#-3.0 のタグを付けたことに気付きました。その場合は、以下の解決策を使用してください。.NET 4.0 で導入されましたZipTuple以下のソリューションではSelect、.NET 3.5 で利用可能だったメソッドを使用しています。どちらのソリューションも LINQ を使用するため、名前空間を追加する必要があります。using System.Linq;

別の解決策は、オーバーロードされたSelectメソッドを使用してターゲット文字のインデックスを取得し、それらのインデックスに基づいて 2 番目のリストからアイテムを取得することです。

var target = "B";
var targetIndices = list1.Select((o, i) => new { Value = o, Index = i })
                         .Where(o => o.Value == target);
var query = targetIndices.Select(o => list2[o.Index]);

foreach(var item in query)
{
    Console.WriteLine(item);
}
于 2013-10-07T16:04:12.770 に答える