Linq同时收集了2个
我有两个清单:
List listA1 = GetFirstList(); List listA2 = GetSecondList();
和class A
定义
class A { public int Id {get; set;} public DateTime ModifiedDate {get; set;} public string Type {get; set;} }
我正在根据以下某些条件做一些事情。
List listA1 = GetFirstList(); List listA2 = GetSecondList(); List result = new List(); for(int i = 0; i < listA1; i++) { if(listA1[i].ModifiedDate != listA2[i].ModifiedDate) { result.Add(listA1[i]); } }
假设:两个列表都包含相同数量的项目,其中Id
和Type
的顺序相同。 这就是为什么我只是检查ModifiedDate
并且由于项目数量和顺序而自动处理rest。
我使用LINQ
更改它,如下所示,它工作正常。
var match = ListA1 .Where(a => listA2.First(ct => ct.Id == a.Id).ModifiedDate != a.ModifiedDate); result.AddRange(match);
但它会迭代ListA1
和ListA2
但在第一种情况下,它只迭代一次。
我的问题是,我可以通过保留其他集合的索引来做LINQ
吗? 换句话说,我可以使LINQ
比现在更优化吗?
您可以使用Enumerable.Zip
按索引链接两个序列:
List result = listA1.Zip(listA2, (a1, a2) => new { a1, a2 }) .Where(x => x.a1.ModifiedDate != x.a2.ModifiedDate) .Select(x => x.a1) .ToList();
即使两个序列都没有实现IList
/ IList
,这也会起作用,因此索引无法访问这些项。
您可以使用listA1.Except(listA2,cmp),其中cmp是IComparer。 就像是:
void Main() { List listA1 = new List { new A { Id=1, ModifiedDate=new DateTime(2016,1,1), Type="A"}, new A { Id=2, ModifiedDate=new DateTime(2016,1,2), Type="A"}, new A { Id=3, ModifiedDate=new DateTime(2016,1,3), Type="A"}, new A { Id=4, ModifiedDate=new DateTime(2016,1,4), Type="A"}, }; List listA2 = new List { new A { Id=1, ModifiedDate=new DateTime(2016,1,1), Type="A"}, new A { Id=2, ModifiedDate=new DateTime(2016,1,2), Type="A"}, new A { Id=3, ModifiedDate=new DateTime(2016,1,3), Type="A"}, new A { Id=4, ModifiedDate=new DateTime(2016,1,5), Type="A"}, new A { Id=5, ModifiedDate=new DateTime(2016,1,6), Type="A"}, new A { Id=6, ModifiedDate=new DateTime(2016,1,7), Type="A"}, }; var cmp = new AEqualityComparer(); var result = listA1.Except(listA2, cmp); foreach (var item in result) { Console.WriteLine("Id:{0}, Date:{1}",item.Id, item.ModifiedDate); } } public class A { public int Id { get; set; } public DateTime ModifiedDate { get; set; } public string Type { get; set; } } public class AEqualityComparer : IEqualityComparer { public bool Equals(A x, A y) { return x.Id == y.Id && x.ModifiedDate == y.ModifiedDate; } public int GetHashCode(A obj) { return obj.ToString().GetHashCode(); } }