2011-10-21 31 views
1

我不能使用示例here,因为它特定于asker正在使用的结构。使用LINQ Except()和两个不同类型的集合

目前,我打算:

PropertyInfo[] props = this.GetType().GetProperties(); 
foreach (DataColumn dataColumn in dataAsDataRow.Table.Columns) 
    if(!props.Any(p => p.Name == dataColumn.ColumnName)) 
     ... 

我宁愿有一个线的东西,如:

foreach (DataColumn dataColumn in dataAsDataRow.Table.Columns.Cast<DataColumn>.Except(props)) 
    ... 

任何想法?

回答

4
var columns = dataAsDataRow.Table.Columns.Cast<DataColumn>().Where(column => !props.Any(p => p.Name == column.ColumnName); 
foreach(DataColumn in columns) 
    .... 

或者稍微优化版本(一如既往,取决于列,属性等的运行时数等):

PropertyInfo[] props = this.GetType().GetProperties(); 
var lookup = new HashSet<string>(props.Select(x=>x.Name)); 
var columns = dataAsDataRow.Table.Columns.Cast<DataColumn>().Where(column => !lookup.Contains(column.Name)); 
+0

不幸的是,dataAsDataRow.Table.Columns是DataColumnCollection,而不是一个DataColumns数组,所以这给了编译器错误:“'DataColumnCollection'不包含'Where'的定义。然而,这很容易通过添加“Columns.Cast ().Where”来解决。感谢您的想法! – Alain

1

您必须使用投影(即Select)或某些可以评估为布尔值的逻辑,然后使用Where将其中一个转换为另一个。

相关问题