我应该如何在lambda表达式中添加where条件

时间:2017-05-09 11:19:21

标签: c# performance linq lambda

我知道很容易将lambda表达式放在下面的行中,但是因为我是新的我不知道。 在下面的代码coupon.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();

4 个答案:

答案 0 :(得分:3)

如果你想在C#中使用类似SQL的语法,你需要在from之后添加它:

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

int[] productIds = (from p in coupon.Products
                    where !excluded.Contains(p.id)
                    select p.Id
                   ).ToArray();

此外,它不是真正的SQL,因此not in无效。改为使用C#等价物(!Contains)。

当您想使用LINQ扩展方法时也一样:

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

int[] productIds = coupon.Products.Where(p => !excluded.Contains(p.id))
                                  .Select(p => p.id)
                                  .ToArray();

答案 1 :(得分:3)

我个人Select首先获得Id,然后进一步的操作可能更快。然后,您可以使用Except代替Where,最后在其上调用ToArray

int[] excludedIds = new int[] { 1, 2, 3 };
int[] productIds = coupon.Products.Select(p => p.Id)
                                  .Except(excludedIds)
                                  .ToArray();

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

.ToArray<int>().Where(i => i.Id not in (1,2));

首先,您致电ToArray然后WhereWhere将返回IEnumerable,您需要一个数组。其次,您select上的Id,然后在您需要Where时尝试访问i中的not in。最后,当您需要!(new int[] { 1, 2 }).Contains(i)时,可以使用Productcommaitems,尽管不能很好地阅读并且在每次检查上创建数组都会很昂贵。

根据您更新的问题,string是一个int[],其中包含以逗号分隔的整数列表。您需要Split,可以使用Parse int[] excludedItems = Productcommaitems.Split(',') .Select(Int32.Parse) .ToArray();

excludedItems

或者更好的是直接创建List<int> excludedItems = new List<int>(); foreach (BasketItem item in basket.Items) { excludedItems.Add(item.Product.Id); }

        let url = "http://apple.com"

    let requestURL = URL(string:url)
    let request = URLRequest(url: requestURL!)
    webView.delegate = self
    webView.loadRequest(request)
}

func webViewDidStartLoad(_ webView: UIWebView) {
    print("Webview started Loading")
}

func webViewDidFinishLoad(_ webView: UIWebView) {
    print("Webview did finish load")
}

答案 2 :(得分:1)

你可以试试

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

答案 3 :(得分:0)

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

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

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