Отправляет email-рассылки с помощью сервиса Sendsay

[prg] поиск элементов списка

Приветствую всех присутствующих.

C#, VS2010.

Есть два списка l1 и l2 типа List<int>.
Размер каждого списка заранее неизвестен,
но сейчас для простоты представим, что l1 содержит цифры
1,2,3,4,
а l2 содержит цифры
44,11,88,4,1.
как видно цифры 1 и 4 есть в обоих списках.
внимание вопрос:
как можно обнаружить эти два совпадения, а найденные элементы записать в
третий список? Потыкался с for и foreach, но пока не выходит.

спасибо.

Ответить   Sun, 30 Jul 2017 09:32:34 +0300 (#3510228)

 

Ответы:

В любом языке в списках реализована стандартная функция поиска. Берете
первый список, смотрите, есть ли элемент во втором списке, если есть, то
записываете. А как уж реализуете, да как угодно, хоть через for.

Ответить   Sun, 30 Jul 2017 13:26:56 +0300 (#3510254)

 

Приветствую всех!

List<int> result = Enumerable.Intersect(l1, l2).ToList();
result.ForEach(i=>Console.WriteLine(i));

Успехов. Анатолий.

Ответить   "i_chay" Sun, 30 Jul 2017 16:37:24 +0300 (#3510269)

 

Здравствуйте.

LINQ имеет несколько методов для работы с множествами, в частности, можно
найти пересечение, посредством метода Intersect.
Выглядит это как-то так:

var first = new List<int> { 1, 2, 3, 4, 5 };
var second = new List<int> { 4, 5, 6, 7 8, 9 };
var intersection = first.Intersect(second);
foreach (var number in intersection)
Console.WriteLine(number);

В результате будут выведены числа 4 и 5.

С уважением, Константин.

Ответить   Sun, 30 Jul 2017 16:27:47 +0300 (#3510276)

 

Здравствуйте Кирилл,
<Есть два списка l1 и l2 типа List<int>.

представим, что l1 содержит цифры 1,2,3,4, а l2 содержит цифры

третий список?
Решил тоже внести свою лепту в решение данной задачи :-)
// инициализируем третий список
List<int> l3 = new List<int>();
// прогоняем, например, список l1 через foreach
Foreach(int num in l1)
{
// сравниваем на совпадение в списке l2
// и при попадании вносим этот элемент в список l3
If(l2.Contains(num))
L3.Add(num);

}

С уважением
Владимир

Ответить   vkon@f*****.de Sun, 30 Jul 2017 22:07:27 +0200 (#3510330)

 

Здравствуйте.

Думаю стоит уточнить, что если l2 ест коллекция типа list<int>, то
l2.Contains(num) будет выполнятся за O(n), поэтому прежде стоит
преобразовать коллекцию l2 в hashset<int>, где Contains в подавляющем
большинстве случаев выполнится за O(1).

С уважением, Константин.

Ответить   Mon, 31 Jul 2017 09:50:27 +0300 (#3510363)

 

Приветствую всех!

При таком преобразовании из списка пропадут все, кроме одного, элементы с
одинаковыми значениями. Сократив коллекцию таким образом, вы, разумеется,
ускорите поиск.
И время, которое потребуется для преобразования, не учтено в ваших расчётах,
а ведь при этом тоже выполняется сравнение элементов исходного списка.
Успехов. Анатолий.
Исходное сообщение > Думаю стоит уточнить, что если l2 ест коллекция типа list<int>, то

Ответить   "i_chay" Mon, 31 Jul 2017 17:44:59 +0300 (#3510415)

 

Можно короче:
List<int> result = l1.FindAll(i=>l2.Contains(i));

Исходное сообщение > // инициализируем третий список

Ответить   "i_chay" Mon, 31 Jul 2017 17:47:30 +0300 (#3510417)