假设我的查询返回一个DataTable,它是一个电子邮件地址列表,一个名为“email”的varchar列;这些电子邮件被授权做某事。
jane@doe.com
mike@foo.com
donald@duck.com
当前登录的用户是harry@houdini.com
。他没有被授权。他不在名单上
是否可以使用Linq迭代DataRows并返回布尔值false
?
或者返回null
或Nothing
或空的对象?
从本质上讲,我想知道Linq版本的
Authorized = List.Contains( "harry@houdini.com")
我真的想知道如何在C#和VB中做到这一点。
由于
答案 0 :(得分:2)
Any
可能更干净了:
bool exists = dataTable.AsEnumerable()
.Any(r => "harry@houdini.com".Equals(r[0]));
您可以将列投影到字符串集合并使用Contains
,但这似乎有些过分。
或定义主键并使用Contains
上的原生DataRowCollection
方法:
dataTable.PrimaryKey = dataTable.Columns[0];
bool exists = dataTable.Rows.Contains("harry@houdini.com");
答案 1 :(得分:2)
以下是DataTable
的工作示例,如下所示
在C#
DataTable dt = new DataTable();
dt.Columns.Add("emails");
dt.Rows.Add("jane@doe.com");
dt.Rows.Add("mike@foo.com");
dt.Rows.Add("donald@duck.com");
var authorized = dt.AsEnumerable().Any(s => s[0].Equals("mike@foo.com")); //returns True
var notAuthorized = dt.AsEnumerable().Any(s => s[0].Equals("harry@houdini.com")); //returns False
在VB
(在线转换)
Dim dt As DataTable = New DataTable
dt.Columns.Add("emails")
dt.Rows.Add("jane@doe.com")
dt.Rows.Add("mike@foo.com")
dt.Rows.Add("donald@duck.com")
Dim authorized As var = dt.AsEnumerable.Any(() => { },
s(0).Equals("mike@foo.com"))
Dim notAuthorized As var = dt.AsEnumerable.Any(() => { },
s(0).Equals("harry@houdini.com"))