在列表中搜索行,其中一个字段匹配字符串数组中的任何值

时间:2013-10-03 07:18:51

标签: c# linq

我想用下面的例子来解释我的问题。

我创建了一个列表,其中包含以下字段: StudEmail,FirstName,LastName,Age,EligibilityMode

现在, 我有一个String Array列表,如下所示,验证所有允许值的EligibilityMode列。

List<string> EligModes = new List<string> { "WithCertificate", "With Certificate", "WithoutCertificate","Without Certificate" };

如何从主列表中获取行列表,其中EligibilityMode在EligModes字符串数组列表中没有匹配的值。

我尝试使用Contains(),existvalue()和Any(),但无法找到解决方案。

MainList.Where(c => (c.EligibilityMode.existvalue(EligModes))).ToList();

对此有何帮助?

编辑:

我在下面尝试过:

DataTable dt1 = new DataTable();
dt1 = ds.Tables[0];
List<object> lst = dt1.AsEnumerable().ToList<object>();

lst = lst.Where(c => !EligModes.Contains(c.EligibilityMode)).ToList();

但它没有识别c.EligibilityMode中的列。

另外,我试过了,

DataTable dt1 = new DataTable();
dt1 = ds.Tables[0];
List<object> lst = dt1.AsEnumerable().ToList<object>();

result = from m in lst
     where !EligModes.Any(val => lst.EligibilityMode.Contains(val))
     select m;

这里也有与lst.EligibilityMode相同的问题。

请确认我从数据表创建列表是正确的。

3 个答案:

答案 0 :(得分:1)

这会从主列表中提供EligMode列表中未列出EligibilityMode值的项目:

MainList.Where(c => !EligModes.Contains(c.EligibilityMode)).ToList();

UPDATE:因此MainList是一个数据行列表,转换为对象,你不能访问数据行的任何属性(实际上EligibilityMode属性,即使这里也不存在)。这是正确的DataTable处理:

var rows = from r in ds.Tables[0].AsEnumerable()
           where !EligModes.Contains(r.Field<string>("EligibilityMode"))
           select r;

或者使用方法语法:

var rows = ds.Tables[0].AsEnumerable()
             .Where(r => !EligModes.Contains(r.Field<string>("EligibilityMode"));

你应该学习basics of Linq to DataSet querying

答案 1 :(得分:0)

尝试这一点(虽然没有检查过):

result = from m in MainList
           where !EligModes.Any(val => MainList.EligibilityMode.Contains(val))
           select m;

答案 2 :(得分:0)

它可能有用。 MainList.Where(c =&gt; EligModes.Contains(c.EligibilityMode))。ToList();