2016-03-04 9 views
1

У меня есть два списка типа list<int>, и я знаю, что мы можем найти общие элементы между двумя списками. Но есть ли способ получить общие элементы и соответствующие индексы общих элементов в перекрестном списке или мне нужно пройти через каждый элемент, чтобы найти индексы.Получить общие элементы с индексом из двух списков C#

+0

Можете ли вы показать код, а также показать пример? –

+0

Вы еще что-нибудь пробовали? Вы, конечно же, можете * сделать это с LINQ, хотя я подозреваю, что это примерно столько же кода, сколько и без. –

+0

Теперь есть два ответа, один из которых соответствует только тем, что значения одинаковы * и * индексы одинаковы, и один из них соответствует только значениям (дающим два индекса для каждого совпадения). Кого вы хотели? –

ответ

4

LINQ имеет операции по проецированию последовательности с использованием индексов, но это не встроено в синтаксис выражения запроса, поэтому для начала необходимо использовать «обычные» вызовы метода расширения. После того, что это довольно легко, хотя, вероятно, так же просто, не используя LINQ, если честно:

var pairs1 = list1.Select((value, index) => new { value, index }); 
var pairs2 = list2.Select((value, index) => new { value, index }); 
var matches = from pair1 in pairs1 
       join pair2 in pairs2 on pair1.value equals pair2.value 
       select new 
       { 
        Value = pair1.value, 
        Index1 = pair1.index, 
        Index2 = pair2.index 
       }; 

(Вы можете использовать from pair2 in pairs2 where pair1.value == pair2.value, если вы предпочитаете ...)

Или не-LINQ (с использованием Tuple<,,> для простоты, другие варианты возможны):

var results = new List<Tuple<int, int, int>>(); 
for (int index1 = 0; index1 < list1.Count; index1++) 
{ 
    for (int index2 = 0; index2 < list2.Count; index2++) 
    { 
     if (list1[index1] == list2[index2]) 
     { 
      results.Add(Tuple.Of(list1[index1], index1, index2); 
     } 
    } 
} 

Обратите внимание, что в отличие от обычной операции пересечения, оба они могут дать вам несколько результатов для того же значения - потому что может быть несколько пар индексов. Например, со списками { 1, 2 } и {2, 2, 0} у вас есть кортежи (значение = 2, index1 = 1, index2 = 0), (значение = 2, index1 = 1, index2 = 1).

+0

Я просто использовал этот ответ, чтобы создать новый объект из строки json, который я использовал из узла rest api. Это круто. Еще раз спасибо за сохранение дня @ Jon Skeet! –

0

попытка ниже кода

List<int> lstA = new List<int>() { 10, 2, 7, 9, 13, 21, 17 }; 
List<int> lstB = new List<int>() { 2, 10, 7, 21, 13, 9, 17 }; 

var lstA_Temp = lstA.Select((value, index) => new { index, value }).ToList(); 
var lstB_Temp = lstB.Select((value, index) => new { index, value }).ToList(); 


List<int> result = (from A in lstA_Temp from B in lstB_Temp 
        where A.index == B.index where A.value == B.value 
        select A.value).ToList(); 

вы также можете сделать это вещь без LINQ см ниже логики

List<int> lstA = new List<int>() { 10, 2, 7, 9, 13, 21, 17 }; 
List<int> lstB = new List<int>() { 2, 10, 7, 21, 13, 9, 17 }; 

List<int> lstResult = new List<int>(); 

for (int i = 0; i < lstA.Count; i++) 
{ 
    if (lstA[i] == lstB[i]) 
     lstResult.Add(lstA[i]); 
} 
+0

Обратите внимание, что если вы соответствуете индексу, было бы проще использовать 'Zip' IMO. –

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