需要帮助扭转此Lambda操作的逻辑

时间:2016-06-01 17:56:35

标签: c# lambda

我正在尝试学习lambda操作,但我无法弄清楚如何让它工作。我所拥有的与我所需要的相反,但我无法弄清楚我需要做些什么来扭转它。

DataTable table1;
List<string> list1;
var duplicates = list1.AsEnumerable()
    .Where(r => table1.AsEnumerable()
    .Any(r2 => r2["ID"] as string == r.ToString()));

我基本上有一个购物车,在这个例子中是table1。当用户将项目添加到他们的购物车时,我想确保他们的购物车中已经存在所述项目。所以我的list1有他们将要放入购物车的商品的ID,而数据表是他们当前的购物车内容,并且有一个名为ID的列。所以我希望结果是list1的剩余项目,这些项目在我的表格的ID列中找不到。

以上内容将获取购物车中 的所有商品。

我认为只需将==更改为!=即可,但事实并非如此。我发现了一堆具有类似问题的不同线程,但我发现的所有线程都是比较两个相同的对象,比如两个具有相同列或两个List<string>对象的数据表。他们说要使用关键字Except。每次我尝试复制这些结果时,我都会遇到语法问题。

这是我从另一个线程尝试过的一件事,但是它给了我一个select语句的语法错误。我尝试在以下主题中以答案为基础:Use LINQ to get items in one List<>, that are not in another List<>

var result = list1.Where(p => !table1.Select(p2 => p2["RegID"] == p.ToString()));

我很感激你能给我的任何帮助!

- 约瑟夫

修改的 这是我的工作代码。

DataTable table1;
List<string> list1;
var duplicates = list1.AsEnumerable()
    .Where(r => table1.AsEnumerable()
    .All(r2 => r2["ID"] as string != r.ToString()));

3 个答案:

答案 0 :(得分:4)

你几乎得到它,只需要否定(!Any表达式:

list1.Where(s => !table1.AsEnumerable().Any(r => r.Field<string>("ID") == s));

或者,您可以使用All

list1.Where(s => table1.AsEnumerable().All(r => r.Field<string>("ID") != s));

答案 1 :(得分:3)

不要反转==,也要反转Any。在这种情况下,All

将其视为

  

数据库中的所有条目都不是此项目

或短

  

如果此项目不在数据库中。

答案 2 :(得分:0)

我个人认为代码难以阅读,我更喜欢Except或Intersect等方法以提高可读性。

开始使用:

// added
numbers1 = new List<int> { 1, 2 };
numbers2 = new List<int> { 3, 4 };
numbers2.Except(numbers1).Dump(); // shows 3, 4

// removed
numbers1 = new List<int> { 1, 2, 3, 4, 5 };
numbers2 = new List<int> { 1, 2, 3, 4 };
numbers1.Except(numbers2).Dump(); // shows 5

// overlapping
numbers1 = new List<int> { 1, 2, 3 };
numbers2 = new List<int> { 2, 3, 4 };
numbers1.Intersect(numbers2).Dump(); // shows 2, 3

在你的情况下

var duplicates = list1.Intersect(table1.AsEnumerable()
                     .Select(s => s["ID"].ToString()))
                     .Any();

会做的。