根据列表筛选Datatable中的记录



我有一个类:

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(在新的DataViewDataTable的默认DataView上)。

给定cardTablecardTypes:

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);

最新更新