同时为2个集合执行Linq
本文关键字:执行 Linq 集合 2个 | 更新日期: 2023-09-27 17:58:04
我有两个列表:
List<A> listA1 = GetFirstList();
List<A> listA2 = GetSecondList();
和class A
定义
class A
{
public int Id {get; set;}
public DateTime ModifiedDate {get; set;}
public string Type {get; set;}
}
我正在做一些基于以下条件的事情。
List<A> listA1 = GetFirstList();
List<A> listA2 = GetSecondList();
List<A> result = new List<A>();
for(int i = 0; i < listA1; i++)
{
if(listA1[i].ModifiedDate != listA2[i].ModifiedDate)
{
result.Add(listA1[i]);
}
}
假设:两个列表都包含相同数量的项目,Id
和Type
的顺序相同。这就是为什么我只是检查ModifiedDate
,其余的都是自动处理的,因为项目计数和订单。
我使用LINQ
进行了如下更改,它运行良好。
var match = ListA1
.Where(a => listA2.First(ct => ct.Id == a.Id).ModifiedDate != a.ModifiedDate);
result.AddRange(match);
但它将在CCD_ 6和CCD_。
我的问题是,我可以通过保留其他集合的索引来执行LINQ
吗?换句话说,我能让LINQ
比现在更优化吗?
您可以使用Enumerable.Zip
通过索引链接两个序列:
List<A> result = listA1.Zip(listA2, (a1, a2) => new { a1, a2 })
.Where(x => x.a1.ModifiedDate != x.a2.ModifiedDate)
.Select(x => x.a1)
.ToList();
即使这两个序列都不实现IList
/IList<T>
,所以不能通过索引访问项,这也会起作用。
您可以使用以下一行:
List<A> result = listA1.Where((t, i) => t.ModifiedDate != listA2[i].ModifiedDate).ToList();
您可以使用listA1。除了(listA2,cmp),其中cmp是一个IComparer。类似于:
void Main()
{
List<A> listA1 = new List<A> {
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<A> listA2 = new List<A> {
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<A>
{
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();
}
}