我有一个类:
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卡片表,上面有以下列:
名称、值、CCvName
+---+------------+-------------+
|Val| Name | CCV |
+---+------------+-------------+
| 1 | Visa | 441 |
| 2 | Master | 121 |
| 3 | Amex | 111 |
| 4 | Diners | 222 |
+---+------------+-------------+
List和DataTable都有唯一的值。我想根据列表中的名称字段从数据表中过滤数据(从cardTable中删除其他记录)。所有值都是字符串类型。
生成的卡片表应为:
+---+------------+-------------+
|Val| Name | CCV |
+---+------------+-------------+
| 1 | Visa | 441 |
| 2 | Master | 121 |
+---+------------+-------------+
提前谢谢。
一种简单的方法是使用RowFilter
(在新的DataView
或DataTable
的默认DataView
上)。
给定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
现在包含您要查找的行。
如果你真的想要一个LINQ解决方案,你可以使用一个简单的Join
:
cardTable = cardTable.AsEnumerable()
.Join(cardTypes,
i => i.Field<string>("Name"),
o => o.Name,
(i, o) => i)
.CopyToDataTable();
您可以编写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);