我正在尝试学习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()));
答案 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();
会做的。