我正在学习编写lambda表达式,我需要有关如何从列表中删除不在另一个列表中的所有元素的帮助.
var list = new List<int> {1, 2, 2, 4, 5};
var list2 = new List<int> { 4, 5 };
// Remove all list items not in List2
// new List Should contain {4,5}
// The lambda expression is the Predicate.
list.RemoveAll(item => item. /*solution expression here*/ );
// Display results.
foreach (int i in list)
{
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 64
您可以使用Contains通过RemoveAll执行此操作:
list.RemoveAll( item => !list2.Contains(item));
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想要交集,使用Enumerable.Intersect会更有效:
list = list.Intersect(list2).ToList();
Run Code Online (Sandbox Code Playgroud)
不同的是,在后一种情况下,您将不会获得重复的条目.例如,如果list2
包含2,在第一种情况下,你会得到{2,2,4,5}
,在第二种情况下,你得到{2,4,5}
.
M.B*_*ann 13
比贺拉斯更容易解决对象问题:
如果您的列表包含一个对象而不是一个标量,那么通过删除对象的一个选定属性就可以了:
var a = allActivePatientContracts.RemoveAll(x => !allPatients.Select(y => y.Id).Contains(x.PatientId));
Run Code Online (Sandbox Code Playgroud)
hor*_*ace 10
这个问题已被标记为已回答,但有一个问题.如果列表包含对象而不是标量,则需要做更多的工作.
我一遍又一遍地尝试使用Remove()和RemoveAt()以及各种各样的东西,但没有一个能正常工作.我甚至无法让Contains()正常工作.从来没有匹配过.我很难过,直到我怀疑它可能无法正确匹配项目.
当我意识到这一点时,我重构了item类来实现IEquatable,然后它开始工作了.
这是我的解决方案:
class GenericLookupE : IEquatable<GenericLookupE>
{
public string ID { get; set; }
public bool Equals( GenericLookupE other )
{
if ( this.ID == other.ID ) return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
在我这样做之后,Reed Copsey的上述RemoveAll()回答对我来说非常合适.
请参阅:http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx
归档时间: |
|
查看次数: |
35332 次 |
最近记录: |