2015-06-18 1 views
-2

У меня есть два вида списка, которые имеют одинаковые данные, но отличаются количеством записей. Я хочу получить несогласованные listviewitems в третьем представлении списка. У меня есть следующий код, но он не помогает. Переменные x и y создают проблему.Linq, чтобы получить разницу в двух списках и поместить его в третий в Windows Form C#

var list1Source = lvFace.Items.Cast<ListViewItem>(); 
var list2Source = lvDBdata.Items.Cast<ListViewItem>(); 

lvDataToUpload = list1Source.Where(
    (x => list2Source.All(y => y.Text != x.Text)); 
+0

Помогает ли какой-либо ответ? Я также отредактировал свой ответ – tariq

+0

И я думаю, вы хотите, чтобы не соответствующие элементы из обоих списков были правы? – tariq

+0

Каково сообщение об ошибке при наведении курсора на ошибку? – tariq

ответ

0

Попробуйте

listIntersection = list1Source.Intersect(list2Source); // Gets matching elements 
listUnion = list1Source.Union(list2Source); // Gets all elements 

lvDataToUpload = listUnion.Except(listIntersection); 
+1

Это найдет пересечение, а не разницу. –

+0

Похоже, что System.Linq не работает, хотя я добавил его ... Этот код также не работает, возможно, из-за System.Linq – user2955299

+0

@JonSkeet Пожалуйста, проверьте сейчас, все в порядке ... Я редактировал его, когда был downvoted:) – tariq

2

Вы ищете LINQ Except method

var lvExcept1 = list1Source.Except(list2Source); 
var lvExcept2 = list2Source.Except(list1Source); 

lvDataToUpload = lvExcept1.Union(lvExcept2); 

Но вы должны переопределить Equals и GetHashCode методы для вашего ListViewItem класса. Если нет возможности сделать это (ListViewItem является Windows Forms класс, а не ваш), вы можете определить свой собственный компаратор равенства:

public class ListViewItemComparer : IEqualityComparer<ListViewItem> 
{ 
    bool IEqualityComparer<ListViewItem>.Equals(ListViewItem x, ListViewItem y) 
    { 
     return (x.Text == y.Text); 
    } 

    int IEqualityComparer<ListViewItem>.GetHashCode(ListViewItem obj) 
    { 
     if (Object.ReferenceEquals(obj, null)) 
      return 0; 

     return obj.Text.GetHashCode(); 
    } 
} 

И окончательный код:

var lvExcept1 = list1Source.Except(list2Source, new ListViewItemComparer()); 
var lvExcept2 = list2Source.Except(list1Source, new ListViewItemComparer()); 

lvDataToUpload = lvExcept1.Union(lvExcept2); 
+0

Мне просто нужен код, который я должен заменить его ... !!! – user2955299

+1

Класс ListViewItem - это не OP для изменения - и это не будет иметь значения, только те вещи, которые находятся в списке1, но не в списке2. Что относительно вещей в списке2, но не в списке1? –

+0

@ JonSkeet, вы правы, я отредактировал ответ, должен быть правильным. – hmnzr

1

LINQ не имеют оператор «заданной разницы» ... но вы можете использовать Except дважды:

var list1Text = list1Source.Select(x => x.Text); 
var list2Text = list2Source.Select(x => x.Text); 
var difference = list1Text.Except(list2Text) 
          .Concat(list2Text.Except(list1Text)) 
          .ToList(); 
+0

визуальная студия показывает красную линию под переменной x ... Я добавил пространство имен System.Linq, но я не знаю, почему это делает ... !!! Компилятор дает ошибку «Невозможно преобразовать лямбда-выражение в тип system.fun, потому что это не тип делегата. – user2955299

+0

Пожалуйста, скажите мне, как решить эту проблему .... !!! – user2955299

+0

@ user2955299 * Покажите мне код * купите книгу Джона, если вам нужна помощь в разработке основ. –

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