C # универсальный список сравнивать и получать несопоставленные строки - PullRequest
0 голосов
/ 23 марта 2019

У меня есть два списка в C #. Мне нужен запрос LINQ для сравнения и вывода списка только несопоставленных строк.

List<First> firstList;
List<Second> secondList;
both have the unique property called ID;

firstList:

ID  Desc1   Desc2           
1   aaa     mmm             
2   bbb     fff             
3   ccc     ttt   
4   ddd     yyy
5   eee     ggg

secondList:

ID  Desc1   Desc2   Status          
1   aaa     mm      P       
2   bbb     fff     S       
3   ccc     ttt     P   
4   ddd     yy      S
5   eee     ggg     P

Результат:

ID  Desc1   Desc2   Status
2   aaa     mm      P
4   ddd     yy      S

Я хочу сравнить Desc1 и Desc2 в firstList со secondList и мне нужно состояние элементов, которые не совпадают.

Ответы [ 2 ]

1 голос
/ 23 марта 2019

некоторые методы для поиска результата (лямбда, linq):

var query0 = secondList.Where(item => firstList.All(f => !item.Desc1.Equals(f.Desc1)  || !item.Desc2.Equals(f.Desc2)));

или

var query1 =
    from item in secondList
    where firstList.All(f => !item.Desc1.Equals(f.Desc1) || !item.Desc2.Equals(f.Desc2))
    select item;

, если вы хотите получить результат в списке вместо перечисления, вы просто добавляете Tolist () в конце:

var list0 = secondlist.Where(item => firstlist.All(f => !item.Desc1.Equals(f.Desc1) || !item.Desc2.Equals(f.Desc2))).ToList();

Чтобы ответить на ваш вопрос в комментарии:

, если вы хотите повторить или выбрать конкретный идентификатор, вы можете сделать это:

        foreach(var item in query0)
        {
           Console.WriteLine($"ID:{item.ID}, Desc1:{item.Desc1}, Desc2:{item.Desc2}, Status:{item.Status}");  
        }

        //if you want to query a particular id:
        var queryid = query0.Where(item => item.ID == particularID);
0 голосов
/ 23 марта 2019

Пожалуйста, смотрите ниже. Вы должны сделать объединение между двумя списками, а затем удалить пересечение. Вам нужно будет реализовать интерфейс IEqualityComparer.

void Main()
{
    List<UserProfile> u1 = new List<UserQuery.UserProfile>(){
        new UserProfile(){ID = 1, FirstName  = "Super" , LastName = "Man"},
        new UserProfile(){ID=2, FirstName = "Spider", LastName="Man"},
        new UserProfile(){ID=3, FirstName = "Bat", LastName="Man"}
    };

    List<UserProfile> u2 = new List<UserProfile>(){
        new UserProfile(){ID = 1, FirstName="Super", LastName="Man"},
        new UserProfile(){ID = 2, FirstName="Thor", LastName="Ragnarok"},
        new UserProfile(){ID = 3, FirstName="Hulk", LastName="Baner"}
    };

//  u1.Intersect(u2, new UserProfileComparer())
//      .ToList()
//      .ForEach(x => Console.WriteLine(x.Name));

//  u1.Except(u2, new UserProfileComparer())
//      .ToList()
//      .ForEach(x => Console.WriteLine(x.Name));

    // (u1 + u2) - (u1*u2)
    u1.Union(u2, new UserProfileComparer())
        .Except(u1.Intersect(u2, new UserProfileComparer()))
        .Distinct()
        .ToList()
        .ForEach(x => Console.WriteLine(x.Name));
}

class UserProfile
{
    public int ID {get;set;}
    public string Name => LastName + "," + FirstName;
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

class UserProfileComparer : IEqualityComparer<UserProfile>
{
    public bool Equals(UserProfile item1, UserProfile item2)
    {
        if (object.ReferenceEquals(item1, item2))
            return true;
        if (item1 == null || item2 == null)
            return false;
        return item1.FirstName.Equals(item2.FirstName) &&
               item1.LastName.Equals(item2.LastName);
    }

    public int GetHashCode(UserProfile item)
    {
        return new { item.FirstName, item.LastName }.GetHashCode();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...