C# 如何在lambda表达式中添加where条件

C# 如何在lambda表达式中添加where条件,c#,performance,linq,lambda,C#,Performance,Linq,Lambda,我知道它很容易把在lambda表达式在下面的行,但因为我是新的,我不知道。 在下面的代码优惠券中,products有大约27000个产品,在下面的行中,我必须添加条件,如 where p.id not in (1,2,3) int[] productIds = (from p in coupon.Products select p.Id).ToArray<int>(); 我应该如何添加和优化我的代码 我试过了 int[] productIds = (from p in coup

我知道它很容易把在lambda表达式在下面的行,但因为我是新的,我不知道。 在下面的代码优惠券中,products有大约27000个产品,在下面的行中,我必须添加条件,如

where p.id not in (1,2,3) 

int[] productIds = (from p in coupon.Products select p.Id).ToArray<int>();
我应该如何添加和优化我的代码

我试过了

int[] productIds = (from p in coupon.Products select p.Id).ToArray<int>().Where(i => i.Id not in (1,2));
我试过这个没用

            List<int> excludedItems = new List<int>();
            foreach (BasketItem item in basket.Items)
            {
                excludedItems.Add(item.Product.Id);
            }

            // int[] excluded = new int[] { 1, 2, 3 };

            int[] productIds = coupon.Products.Where(p => excludedItems.Contains(p.Id))
                                              .Select(p => p.Id)
                                              .ToArray();

如果要在C中使用类似SQL的语法,需要将其添加到from之后:

而且,它不是真正的SQL,因此not in无效。使用C等价物!而是包含

如果要使用LINQ扩展方法,请执行以下操作:

int[] excluded = new int[] { 1, 2, 3 };

int[] productIds = coupon.Products.Where(p => !excluded.Contains(p.id))
                                  .Select(p => p.id)
                                  .ToArray();
我个人会选择首先获取ID,因为这样进一步的操作可能会更快。然后,您可以使用Exception而不是Where,最后在其上调用ToArray

代码的问题来自以下部分:

.ToArray<int>().Where(i => i.Id not in (1,2));
或者最好直接创建excludedItems:

List<int> excludedItems = new List<int>();
foreach (BasketItem item in basket.Items)
{
    excludedItems.Add(item.Product.Id);
}

您可以像这样使用C Linq语法

int[] filterOut = new int[] {1,2,3};

int[] productIds = coupon.Products.Where(x => !filterOut.Contains(x.Id).Select(x => x.Id).ToArray();
你可以试试看

int[] array = new int[] { 1, 2, 3 };
int[] ids = coupon.Products.Where(t => !array.Contains(t.id)).Select(t => t.id).ToArray<int>();

在ToArray之前添加Where,我认为应该可以使用。@TamásSzabó他们不会在Id上选择然后调用。Id在itTrue上,第二个lambda需要是I=>I不在1,2中。很好使用,除了。@PatrickHofman我也喜欢!在您的答案中包含,我认为这实际上取决于阅读效果更好的情况。如何将Productcommaitems转换为int[]excludedIds?@Xtremcool我已更新了我的答案,将来包括您遇到问题的所有代码,只要它们与本例相关。如果它们不相关,请创建另一个问题。@Xtremcool请自己试一试,如果结果与预期不符,您可以随时提出新问题并提供。这将返回乘积,而不是整数。此外,调用ToList是多余的,为什么要先转换为列表,然后再转换为数组,这只是在浪费资源。在每个循环上创建数组是非常昂贵的,您可以使用否定!,而不是==false,它是冗余的,ToList是冗余且昂贵的,最后,它可能会更快地选择哪一个是好的。如何将Productcommaitems转换为int[]excludedIds@Xtremcool那是一根绳子。这怎么可能是一个整数数组呢?如果我创建一个StoreProcedure并传递排除项并重新检查其中的项,然后返回匹配的产品,然后将该值存储在int[]productId中,那么我只需询问,而不是放置此代码。那样会减少我的时间吗?现在需要更多的时间
List<int> excludedItems = new List<int>();
foreach (BasketItem item in basket.Items)
{
    excludedItems.Add(item.Product.Id);
}
int[] filterOut = new int[] {1,2,3};

int[] productIds = coupon.Products.Where(x => !filterOut.Contains(x.Id).Select(x => x.Id).ToArray();
int[] array = new int[] { 1, 2, 3 };
int[] ids = coupon.Products.Where(t => !array.Contains(t.id)).Select(t => t.id).ToArray<int>();