【发布时间】:2016-06-04 16:13:47
【问题描述】:
我最近问了这个问题,关于如何比较两个列表并检查新列表中添加的项目。
我有两个 IList 类型的对象:
public class SampleSentence
{
public int SampleSentenceId { get; set; }
public string Text { get; set; }
}
IList<SampleSentence> Old =
[new SampleSentence() { SampleSentenceId = 1; Text = 'cat' }]
IList<SampleSentence> New =
[new SampleSentence() { Text = 'cat' }],
new SampleSentence() { Text = 'dog' }]
我需要得到的是:
IList<SampleSentence> whatINeed =
[new SampleSentence() { Text = 'dog' }]
- Object
Old是一个 SampleSentences 列表,其中填充了 SampleSentenceId 和 Text 字段。 - Object
New是一个 SampleSentences 列表,其中仅填充了 Text 字段。它将具有与对象Old相同或更多的行
使用 LINQ 如何比较 Old 和 New 对象(将它们与 Text 的内容链接)并创建另一个 IList,该列表中有名为 New 的附加列?
1. 我收到的答案似乎有效:
IList<SampleSentence> whatINeed = New.GroupJoin(Old,
newElement => newElement.Text, oldElement => oldElement.Text,
(newElement, oldElements) => new { newElement, oldElements })
.Where(match => !match.oldElements.Any())
.Select(match => match.newElement)
.ToList();
2. 但我自己也想出了这个答案。
var addS = sampleSentences
.Where(wb => oldObjS
.All(db1 => db1.Text != wb.Text))
.ToList();
这第二个答案似乎也有效,但我不知道为什么。有人可以解释这两种编码方法是否相同并解释 .ALL 在这种情况下如何工作?谁能看到第二种方法在所有情况下都不起作用的原因?
【问题讨论】:
-
直接的解决方案是使用Enumerable.Except