【问题标题】:Compare two lists and remove items that are not found in list2比较两个列表并删除list2中没有的项目
【发布时间】:2019-10-19 02:46:32
【问题描述】:

我有两个列表-

List<String> List1;
List<File> List2;

内容如下-

List1                   List2
-----                   -----
String                  ID    FileName     LastWrite

tttaaaajk34j34          1       aaa        01-02-2019
oooccc                  2       bbb        14-09-2018
ddd                     3       ccc        23-06-2019
ttt                     4       ddd        15-10-2016
aaa2832kajj             5       eee        20-08-2012

我想将 List1 与 List2 进行比较,并从 List2 中删除在 List1 中找到的项目。

结果-

List2
----
ID     FileName

2       bbb
4       ddd
5       eee

我的代码-

List1.Where(f => !List1.Any(str => str.FileName.Contains(List2)))

问题-

这不起作用。它会抛出异常,因为 List2 是一个 List,不像 List1 是 List。

'String does not contain a definition for filename and no extension method filename accepting a first argument of type string..

【问题讨论】:

标签: c# linq


【解决方案1】:

您可以使用 LINQ 过滤掉文件:

List1.Where(f => !List2.Any(str => str.Contains(f.FileName)))

解释:

  • 使用Enumerable.Where()先过滤掉List1中你要保留的文件。
  • 使用String.Contains() 检查来自List2 的文件中的Enumerable.Any() 是否具有来自List1 的子字符串文件名FileName。在这种情况下,我们确保在谓词中使用! 运算符,以确保我们不会保留在List2 中找到的文件。

更新

根据问题中的更新要求,只需切换 List1List2。您的新查询应该是:

List2.Where(f => !List1.Any(str => str.Contains(f.FileName)))

【讨论】:

  • 道歉。我刚刚意识到我在写问题时犯了一个错误。包含 ID、文件名、上次写入时间的列表实际上不是 List1。它是List 2。包含字符串的列表是List1。你能帮我解决这个问题吗?提前致谢。
  • @ILoveIndia 我相信通过我提供的查询,您可以根据您的新要求对其进行修改。这只是一个简单的换东西的问题。此外,您当前的更新仍未反映上述评论中的更改。
  • 我收到此错误:运行修改后的查询时无法从 system.collections.generic.list 转换为字符串:List1.Where(f => !List1.Any(str => str.FileName.Contains(List2)));
  • 感谢 RoadRunner 的回复。但它会抛出异常“字符串不包含文件名的定义...”,因为 List2 是 List,不像 List1 是 List
  • @ILoveIndia 请更新您的问题,您的要求现在含糊不清。我越来越糊涂了……
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多