C# 对两个不同类型的集合使用LINQ Except()

C# 对两个不同类型的集合使用LINQ Except(),c#,linq,.net-4.0,C#,Linq,.net 4.0,我不能使用这个例子,因为它是特定于询问者使用的结构的 目前,我将: PropertyInfo[] props = this.GetType().GetProperties(); foreach (DataColumn dataColumn in dataAsDataRow.Table.Columns) if( !props.Any(p => p.Name == dataColumn.ColumnName) ) ... 我更喜欢一行中的内容,例如: foreach

我不能使用这个例子,因为它是特定于询问者使用的结构的

目前,我将:

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

有什么想法吗?

您必须使用投影(即选择)将一个转换为另一个,或者使用一些可以计算为布尔值的逻辑,然后使用Where。

您必须使用投影(即选择)将一个转换为另一个,或者使用一些可以计算为布尔值的逻辑,然后使用Where

或者像往常一样略微优化的版本,具体取决于运行时的列数、属性等:

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));
或者像往常一样略微优化的版本,具体取决于运行时的列数、属性等:

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

不幸的是,dataAsDataRow.Table.Columns是DataColumnCollection,而不是DataColumns数组,因此会出现编译器错误:“DataColumnCollection”不包含“Where”的定义。但是,通过添加Columns.Cast.Where可以轻松解决此问题。谢谢你的主意!不幸的是,dataAsDataRow.Table.Columns是DataColumnCollection,而不是DataColumns数组,因此会出现编译器错误:“DataColumnCollection”不包含“Where”的定义。但是,通过添加Columns.Cast.Where可以轻松解决此问题。谢谢你的主意!