我有两个dataTable,如下所示
1)dtExistingZipCodeInDB(来自数据库的数据)
2)dtCSVExcelSource(来自csv源的数据待处理)
我有两个要求
1)列出所有已退役的邮政编码(dtExistingZipCodeInDB中存在但不包含在dtCSVExcelSource中的邮政编码)
2)UnChanged邮政编码(dtExistingZipCodeInDB和dtCSVExcelSource中都有的邮政编码)
我可以使用Merge来获取已退役的邮政编码。如何获取未更改的邮政编码?
框架:.Net 3.0
//Note: dtExistingZipCodeInDB and dtCSVExcelSource has the same columns
dtCSVExcelSource.Merge(dtExistingZipCodeInDB);
DataTable dtRetiredZipDataTable = dtCSVExcelSource.GetChanges();
string retiredZipCodes = GetStringFromDataTable(dtRetiredZipDataTable, "ZipCode");
由于
Lijo
答案 0 :(得分:2)
对于.NET 3.0的要求,Intersect LINQ扩展方法不可用,但您可以提供自己的扩展方法。
您所需的所有需要MatchingRows
扩展方法(请参阅下面的演示代码),然后执行:
IEnumerable<DataRow> unchangedZipCodes = dtExistingZipCodeInDB.MatchingRows(dtCSVExcelSource, "ZipCode");
然后你可以遍历未更改的ZipCodes,它只包含dtExistingZipCodeInDB和dtCSVExcelSource之间共同的ZipCodes行。
下面是我使用LINQPad编写的演示代码。我喜欢LINQPad - 这对于概念验证或快速填充/打包一些代码非常有用。但是对于这个问题的解决方案并不是 required 。
void Main()
{
string colname = "ZipCode";
var dt = new DataTable();
dt.Columns.Add(colname, typeof(string));
dt.Rows.Add(new [] { "12345" } );
dt.Rows.Add(new [] { "67890" } );
dt.Rows.Add(new [] { "40291" } );
var dt2 = new DataTable();
dt2.Columns.Add(colname, typeof(string));
dt2.Rows.Add(new [] { "12345" } );
dt2.Rows.Add(new [] { "83791" } );
dt2.Rows.Add(new [] { "24520" } );
dt2.Rows.Add(new [] { "48023" } );
dt2.Rows.Add(new [] { "67890" } );
/// With .NET 3.5 LINQ extensions, it can be done inline.
// var results = dt.AsEnumerable()
// .Select(r => r.Field<string>(colname))
// .Intersect(dt2.AsEnumerable()
// .Select(r => r.Field<string>(colname)));
// Console.Write(String.Join(", ", results.ToArray()));
var results = dt.MatchingRows(dt2, colname);
foreach (DataRow r in results)
Console.WriteLine(r[colname]);
}
public static class Extensions
{
/// With .NET 3.0 and no LINQ, create an extension method using yield.
public static IEnumerable<DataRow> MatchingRows(this DataTable dt, DataTable dtCompare, string colName)
{
foreach (DataRow r in dt.Rows)
{
if (dtCompare.Select(String.Format("{0} = {1}", colName, r[(colName)])).Length > 0)
yield return r;
}
}
}
输出:
12345
67890