我需要找到2个通用列表之间的第一个匹配记录 以下是我编写的代码。但是,即使在获得匹配后,它仍在处理进一步的记录。有没有办法打破下面的查询?像“休息”或“退出”这样的东西
foreach (var itemOld in oldList)
{
var result = (from itemNew in newList
where itemNew.Id == itemOld.Id
select itemNew).ToList();
// Do processing
}
答案 0 :(得分:2)
您要查找的关键字是break;
foreach (var itemOld in oldList)
{
var result = (from itemNew in newList
where itemNew.Id == itemOld.Id
select itemNew).ToList();
if(someThingisTrue){
break;
}
}
答案 1 :(得分:1)
你可以这样做。一旦找到匹配项,内部和外部查询都将终止:
foreach (var itemOld in oldList)
{
var result = (from itemNew in newList
where itemNew.Id == itemOld.Id
select itemNew).FirstOrDefault();
if (result != null)
{
// process result
break;
}
}
你也可以像这样组合它们:
var result = (from itemNew in newList
from itemOld in oldList
where itemNew.Id == itemOld.Id
select itemNew).FirstOrDefault();
if (result != null)
{
// process result
}
不同之处在于第一种方法将反复进行newList
,直到找到匹配为止。第二个将重复执行oldList
,直到找到匹配项。
要在下面说明您的评论,如果您要处理所有匹配项,只需从第一个示例中删除break
,或者为第二个版本执行此操作:
var results = from itemNew in newList
from itemOld in oldList
where itemNew.Id == itemOld.Id
select itemNew;
foreach (var item in results)
{
// process item
}
答案 2 :(得分:1)
只是为了好玩。
var predicate = itemNew => oldList.FirstOrDefault(itemOld => itemOld.Id == itemNew.Id);
var result = newList.FirstOrDefault(predicate);
编辑:正如评论中指出的那样,我做错了顺序=(。修正了正确性。
答案 3 :(得分:0)
有点晚了,但你可以通过加入来做到这一点:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public class Item
{
public int Id { get; set; }
}
public static void Main()
{
var oldList = new List<Item>();
oldList.Add(new Item() { Id = 3 });
oldList.Add(new Item() { Id = 4 });
oldList.Add(new Item() { Id = 5 });
var newList = new List<Item>();
newList.Add(new Item() { Id = 1 });
newList.Add(new Item() { Id = 2 });
newList.Add(new Item() { Id = 3 });
// here is the linq join
var result =
newList.Join(
oldList,
item => item.Id,
item => item.Id,
(itemNew, itemOld) => itemNew).FirstOrDefault();
// outputs 3
Console.WriteLine(result.Id);
}
}