2016-08-15 5 views
-1

リストにはランダムなインデックスが含まれています。私はそれにクラスオブジェクトを含む別のリストBを持っています。私はリストAにあるインデックスを使ってリストBを解析し、Linqを使ってその中にAmarという名前のオブジェクトを見つけたいと思います。例えばリストの要素の集合を検索するためのC#のLinqクエリ

List<int> Indexes = new List<int>(); // This contains the random indexes 
List<Student> StuObj = new List<Student>(); 

Class Student 
{ 
    String name; 
} 

は今、私は、リストIndexesに存在するインデックスに関してリストStuObjを解析し、名前がAmarあるリストStuObjStudentオブジェクトのインデックスが存在取得したいです。

+0

コードを入力して例を挙げてください。どのようなクラスオブジェクトがありますか?本当にLinqを使用する必要がありますか? –

+0

あなたはStuObjの要素を見つけたいと言っていますか? StuObjの要素のインデックスはインデックスにあります AND 学生の名前はAmarですか? –

答えて

1

これはLinqを使用して行うことができます。

List<int> indexes = new List<int>() { 5, 1 , 10, 30 }; 

var results = listB.Where((item, index)=> indexes.Contains(index) 
             && item.Name == "Amar") 
        .Select(x => listB.IndexOf(x)).To‌​List(); 

編集:Whereは、要素のインデックスを提供し、過負荷持つ元listB内の要素のインデックスを取得するために、あなたはIndexOf(T)方法を利用することができます。このような

+0

オブジェクトの代わりにオブジェクトのインデックスを取得する方法 –

+0

@ G.T。 '.ToList()'を '.Select(x => listB.IndexOf(x))に置き換えることができます。ToList();' – user3185569

+0

@ G.T。あなたは間違った結果をもたらす答えを受け入れました。 '.Select((item、index)=> index)'はフィルタリングされたセットのインデックスを選択するので、常に要素の数まで0,1,2,3などを取得します。 – user3185569

0

何か:

var result = listA 
    .Where(i => i >= 0 && i < listB.Count) 
    .Select(i => listB[i]) 
    .FirstOrDefault(b => b.Name == "Amar"); 

基本的にあなたがlistBの要素のインデックスとしてlistAからの値を使用します。 listAに有効なインデックスのみが含まれていることがわかっている場合は、Whereコールを削除できます。

EDIT:更新質問1として、答えはさらに簡単です:

var result = listA 
    .Where(i => i >= 0 && i < listB.Count && listB[i].Name == "Amar") 
    .ToList(); 

私はいくつかの他の回答で提案されているように、線形検索(故に遅い)メソッドContainsIndexOfを使用するには、絶対にない理由を見ません。

indexList.Select(i => dataList[i]); 

indexListが整数< 0または>サイズのが含まれている場合は、あなたが起こるしたいものを考慮する必要があります。次のように選択し使用することができ、あなたは二つのリスト、リストindexListとリストデータリストを持っていると仮定すると

0

dataList。

indexList.Select(i => i < 0 || i >= dataList.Count ? null : dataList[i]); 

それとも、のようにそれらを除外することもできます:

indexList.Where(i => i>=0 && i < dataList.Count).Select(i => dataList[i]); 

それともあなたは、インデックス内のアイテムを持っていることはありません前提条件を経由して知っている可能性がありますたとえば、あなたは次のように、ヌルで無効なエントリを置き換えることができます有効な値の範囲外のリスト。更新質問に基づいて

EDIT 、これを試してみてください。

dataList.Where((item, index) => indexList.Contains(index) && item.Name == "Amar") 
    .Select(item => dataList.IndexOf(item)); 

これは、アイテムのインデックスを取ることを選択し、オーバーロードを利用しています。 Where句は、dataList内の項目のインデックスがindexList内にある項目と、その項目の名前がAmarの項目を選択します。 Select句は、元のデータリストの項目のインデックスを返します。

+0

最後の選択がフィルタリングされたリストにインデックスを生成するので、これは間違った結果をもたらします。 – user3185569

+0

あなたは正解です、ありがとうございます。 IndexOfを使用するようにコードを修正しました –

0

これは動作するはずです:それは必要なオブジェクトのみを取得するための高速インデックス検索を実行

var result = Indexes 
    .Select(i => StuObj[i]) 
    .Where(s => s.name = "Amar").ToList() 

。レコードが1つしかないことがわかっている場合は、ToListの代わりにFirstまたはFirstOrDefaultを使用できます。

関連する問題