使用LINQ Except()和两个不同类型的集合

时间:2011-10-21 15:35:10

标签: c# linq .net-4.0

我无法使用示例here,因为它特定于提问者正在使用的结构。

目前,我要去:

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

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