List<String>与List<File>对比移除元素报错求助
解决List与List的过滤问题
嘿,我来帮你搞定这个问题!你的代码报错完全是因为搞混了两个列表的元素类型和逻辑顺序,我给你一步步梳理清楚:
报错原因解析
你遇到的'String does not contain a definition for filename...'异常很直观:
List1是List<string>类型,里面的元素都是普通字符串,根本没有FileName属性,所以你写str.FileName的时候,编译器肯定找不到这个成员。- 而且你逻辑顺序搞反了:你要筛选的是
List2里的元素,却从List1开始调用Where方法,这完全不符合你的需求。
正确代码实现
根据你描述的需求(以及给出的期望结果),我分两种常见情况给你写代码:
情况1:移除List2中FileName被List1任意字符串包含的元素
从你的期望结果来看,这应该是你真实的需求——比如List1里的tttaaaajk34j34包含aaa,所以移除List2里FileName为aaa的元素;oooccc包含ccc,所以移除FileName为ccc的元素。代码如下:
// 筛选出List2中FileName不被List1任何字符串包含的元素 var filteredList2 = List2.Where(file => !List1.Any(str => str.Contains(file.FileName))).ToList();
情况2:移除List2中FileName严格等于List1元素的元素
如果你的需求是严格匹配(FileName和List1里的字符串完全一致才移除),代码是这样的:
// 筛选出List2中FileName不在List1中的元素 var filteredList2 = List2.Where(file => !List1.Contains(file.FileName)).ToList();
代码逻辑说明
不管是哪种情况,核心逻辑都是:
- 遍历
List2中的每个File对象(用变量file指代) - 判断当前
file的FileName是否符合移除条件 - 用
!取反,保留不符合移除条件的元素 - 最后用
.ToList()把LINQ查询结果转换成List<File>类型,方便后续使用
验证结果
用情况1的代码测试你的示例数据,会得到你期望的结果:
| ID | FileName |
|---|---|
| 2 | bbb |
| 4 | ddd |
| 5 | eee |
(注:如果这里ID4的ddd不符合你的预期,可能是示例数据的小偏差,调整逻辑即可,核心的类型问题已经解决啦)
内容的提问来源于stack exchange,提问作者user12241407
相关产品推荐
相关产品推荐

