2013-10-07 2 views
1

У меня есть два списка:Получить индекс первого списка и использовать его в другом списке

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 и найти corrosponding значения в List2. То, что я делаю, это получить начальный и конечный индекс List1, где значение равно B. Затем перебирает список2 для этих индексов и получает значения. Это похоже на слишком много работы и много накладных расходов. Есть ли лучший способ сделать это с помощью linq?

Я использовал это: var list1Values = list1.FindAll(x => x.Contains("B")); Это дает мне значения из B, я застрял после этого, как можно получить соответствующие значения из списка2 после этого? Поскольку findAll даже не дает индекс. Одна мысль состоит в том, чтобы прокрутить индекс list1Values ​​и получить значения list2, но не думаю, что это правильный способ сделать это.

+0

Пожалуйста, покажите, что у вас есть. –

+0

@ DanielHilgarth - я использовал это: var list1Values ​​= list1.FindAll (x => x.Contains ("B")); Это дает мне значения из B, я застрял после этого, как можно получить соответствующие значения из списка2 после этого? Поскольку findAll даже не дает индекс. Одна мысль состоит в том, чтобы прокрутить индекс list1Values ​​и получить значения list2, но не думаю, что это правильный способ сделать это. – NoviceMe

+0

Пожалуйста, обновите свой вопрос с помощью этой информации. Благодарю. –

ответ

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 этого письма от list1 и Item2 является соответствующим в list2. Конечно, вы могли бы использовать анонимный тип и вместо него использовать более значимое имя.

UPDATE: Я только что заметил, что вы отметили вопрос C# -3.0. В этом случае воспользуйтесь приведенным ниже решением. Zip и Tuple были представлены в .NET 4.0. В приведенном ниже решении используется метод Select, который был доступен в .NET 3.5. Оба решения используют LINQ, так что вам нужно, чтобы добавить пространство имен: using System.Linq;

Другим решением является использование перегруженного Select method получить индексы целевой буквы, то захватывая элементы из второго списка на основе этих показателей.

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); 
} 
+0

Я не вижу Zip под моим списком1? Мой список1 - это строковый список, такой как: var list1 = new List (); – NoviceMe

+0

@NoviceMe 'Zip' - это метод расширения LINQ, добавленный в .NET 4.0. Я обновил свой ответ, чтобы вместо этого использовать C# 3.0/.NET 3.5. Убедитесь, что вы добавили 'using System.Linq ;' в свой файл C#, чтобы импортировать требуемое пространство имен. –

Смежные вопросы