如何从Linq查询中断或退出

时间:2015-03-12 04:47:48

标签: c# performance linq

我需要找到2个通用列表之间的第一个匹配记录 以下是我编写的代码。但是,即使在获得匹配后,它仍在处理进一步的记录。有没有办法打破下面的查询?像“休息”或“退出”这样的东西

     foreach (var itemOld in oldList)
        {
            var result = (from itemNew in newList
                          where itemNew.Id == itemOld.Id
                          select itemNew).ToList();

            // Do processing
        }

4 个答案:

答案 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);
    }
}