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

236
21 апреля 2017, 17:46
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication18
{
    class Program
    {
        static void Main(string[] args)
        {
            var list1 = new List<MyClass>() {
                new MyClass {
                    Id = Guid.Parse("C0AFA906-40D3-4FAA-B7D2-000B6C17CA93"),
                    str = "qwer"
                },
                new MyClass {
                      Id = Guid.Parse("D4AB9FBF-E6F2-4236-A0BE-000C9C55F6D9"),
                    str = "asd"
                },
                  new MyClass {
                      Id = Guid.Parse("АB9C258F-58F4-4F96-8B15-000E38BD55CC"),
                    str = "zxc"
                }
            };
            var list2 = new List<MyClass>() {
                new MyClass {
                    Id = Guid.Parse("C0AFA906-40D3-4FAA-B7D2-000B6C17CA93"),
                    str = "qwer"
                },
                new MyClass {
                      Id = Guid.Parse("D4AB9FBF-E6F2-4236-A0BE-000C9C55F6D9"),
                    str = "asd"
                }
            };
            var list3 = new List<MyClass>();
            foreach (var item1 in list1)
            {
                foreach (var item2 in list2)
                {
                    if (item1.Id == item2.Id)
                        list3.Add(item1);
                }
            }
            foreach (var item in list3)
            {
                Console.WriteLine($"Результат: Id={item.Id}, str={item.str}");
                //Результат две строки: Id=C0AFA906-40D3-4FAA-B7D2-000B6C17CA93, str=qwer; 
                //                      Id =D4AB9FBF-E6F2-4236-A0BE-000C9C55F6D9, str=asd
            }
        }
    }
    public class MyClass
    {
        public Guid Id { get; set; }
        public string str { get; set; }
    }
}
Answer 1

Для того, чтобы удалить все элементы подходящие под условие можно использовать метод RemoveAll

Далее в предикате нужно проверить условие, что проверяемого элемента нет во втором списке, для этого можно использовать метод Exists

В итоге код может выглядеть так:

list1.RemoveAll(el=> !list2.Exists(el2=>el2.Id == el.Id))

Либо можно использовать метод Intersect

var list3 = list1.Intersect(list2, new CompareByGuid());

Где класс CompareByGuid может иметь следующую реализацию:

class CompareByGuid : IEqualityComparer<MyClass>
{
    // Products are equal if their names and product numbers are equal.
    public bool Equals(MyClass x, MyClass y)
    {
        //Check whether properties are equal.
        return x.Id == y.Id;
    }
    // If Equals() returns true for a pair of objects 
    // then GetHashCode() must return the same value for these objects.
    public int GetHashCode(MyClass a)
    {
        //Calculate the hash code for the product.
        return x.Id.GetHashCode();
    }
}   
READ ALSO
Повторный вызов метода OnCreate()

Повторный вызов метода OnCreate()

При развертывании проекта (чтение sms-сообщений), после получения сообщения приложение открывается три разаПо-моему OnCreate() запускается несколько...

222
Как завершить tcp соединение для windows.networking.sockets windows phone 8.1 c#

Как завершить tcp соединение для windows.networking.sockets windows phone 8.1 c#

Как завершить tcp соединение для windowsnetworking

203
Обработка исключения InvalidOperationException (Windows Forms, C#)

Обработка исключения InvalidOperationException (Windows Forms, C#)

Вот стал вроде как простой вопросНеобходимо в windows forms получить изображение из видео потока

211
Как установить ms office на Azure Cloud Services?

Как установить ms office на Azure Cloud Services?

Я пишу сайт на которое пользователи загружают ms word документы, а сайт редактирует документы с помощью COMПоэтому мне нужно чтобы на сервере...

190