我有一个班级:
public class Cards
{
private string _type= string.Empty;
private string _name= string.Empty;
public string Type
{
get { return _type; }
set { _type= value; }
}
public string Name
{
get { return _name; }
set { _name= value; }
}
}
我有这个班级的对象。
public List<Cards> CardTypes = new List<Cards>();
列表卡中的值为:
Name Type
==============
Visa Vi
Master MA
Discover DI
我有一个DataTable cardTable,其中包含以下列:
名称,值CCvName
+---+------------+-------------+
|Val| Name | CCV |
+---+------------+-------------+
| 1 | Visa | 441 |
| 2 | Master | 121 |
| 3 | Amex | 111 |
| 4 | Diners | 222 |
+---+------------+-------------+
List和DataTable都具有唯一值。我想根据List中的Name字段过滤数据表中的数据(从cardTable中删除其他记录)。所有值都是字符串类型。
生成的cardTable应为:
+---+------------+-------------+
|Val| Name | CCV |
+---+------------+-------------+
| 1 | Visa | 441 |
| 2 | Master | 121 |
+---+------------+-------------+
提前致谢。
答案 0 :(得分:2)
一种简单的方法是使用RowFilter
(DataView
的新DataView
或DataTable
的默认cardTable
。
给定cardTypes
和var view = new DataView(cardTable)
{
// create filter: [Name] IN ('Visa','Master','Discover')
RowFilter = String.Format("[Name] IN ({0})", String.Join(",", cardTypes.Select(t => "'" + t.Name + "'")))
};
:
view
Join
现在包含您要查找的行。
如果您真的需要LINQ解决方案,可以使用简单的cardTable = cardTable.AsEnumerable()
.Join(cardTypes,
i => i.Field<string>("Name"),
o => o.Name,
(i, o) => i)
.CopyToDataTable();
:
{{1}}
答案 1 :(得分:0)
您可以在列表中编写没有相应卡类型的LINQ连接查询返回行:
var rowsToDelete = from r in cardTable.AsEnumerable()
join c in CardTypes
on r.Field<string>("Name") equals c.Name into g
where !g.Any()
select r;
然后删除这些行:
foreach(var row in rowsToDelete)
cardTable.Rows.Remove(row);