2012-09-13 43 views
-1

我有两个通用列表。他们有不同的领域,但他们有共同的4个领域。我想获得列表中的项目列表中的一个列表,但没有使用这四个字段作为“相等”的定义。不等于两个通用列表

这是我解决问题的尝试。

var unMatchedData = from liveLines in liveList 
    join oldList in comapreSnapshotList 
    on new {liveLines.ClientNo, liveLines.SequenceNo, liveLines.LineNo, liveLines.Text} equals 
    new {oldList.ClientNo, oldList.SequenceNo, oldList.LineNo, oldList.Text} 
    select new KNOWTXTS 
    { 
     ClientNo = liveLines.ClientNo, 
     SequenceNo = liveLines.SequenceNo, 
     LineNo = liveLines.LineNo, 
     Text = liveLines.Text 
    }; 
+1

可能重复:http://stackoverflow.com/questions/3669507/using-linq-not-equals –

+1

另一种可能的重复:http://stackoverflow.com/questions/3762869/is-there-a -not-equal-in-a-linq-join –

+0

_“查找不匹配任何列表中的项目”_您是否想要查找在'liveList'中但不在'comapreSnapshotList'中的项目,反之亦然? –

回答

1

您可以使用Except找到设置的差异。

var newElements = liveList.Select(l => new { 
         l.ClientNo, l.SequenceNo, l.LineNo, l.Text 
        }); 
var oldElements = comapreSnapshotList.Select(l => new { 
         l.ClientNo, l.SequenceNo, l.LineNo, l.Text 
        }); 
var newElementsInNew = newElements.Except(oldElements); 
var deletedFromNew = oldElements.Except(newElements); 


// if you need the original object in the list 
var newElements = from obj in liveList 
        join newEle in newElementsInNew 
        on new {obj.ClientNo, obj.SequenceNo, obj.LineNo, obj.Text} equals newEle 
        select obj; 
var deletedElements = from obj in comapreSnapshotList 
        join deletedEle in deletedFromNew 
        on new {obj.ClientNo, obj.SequenceNo, obj.LineNo, obj.Text} equals deletedEle 
        select obj; 
+0

看看建议的重复项中的答案。如果你需要实际的项目,而不是用于比较的匿名类型,那么他们会更好。 – Servy