从linq中的列表中删除包含整个短语c#的项目

时间:2018-07-31 16:26:38

标签: c# lambda

我希望这是一个快速的问题。我有带有“路径”属性的项目列表。我使用以下行:

docReturnResult.RemoveAll(x => !x.DocumentPath.Contains(library));

这确实删除了我需要的项目,但是我遇到了问题。如果library的值为“ Non Archive”,并且我在docReturnResult列表中有两个项目,一个在路径中带有“ / Non Archive /”,另一个具有“ / Archive /”,则将它们都删除。我只想删除与库的整个值不匹配的项目,所以我只希望删除“ / Archive /”而不是全部删除。如何指定确切值?

谢谢。

1 个答案:

答案 0 :(得分:0)

您正在寻找

 docReturnResult.RemoveAll(x => !x.DocumentPath.Equals(library));

我使用Equals而不是==的原因是==是参考检查,询问对象是否为相同的参考。 其中“等于”仅验证对象的值。 因此,具有相同内容的两个不同对象引用将仍然相等,==运算符将返回false,因为引用标识符不相同。 如果我错了,我敢肯定有人比我有更好的解释:)

更新:

提供的只是确定路径本身的一部分, 我会用'/'上的Split函数分割整个路径 然后检查库是否等于结果数组中的任何值。

稍等片刻,我必须加载Visual Studio来实际调试拆分是否达到了linq中的预期:)

更新2:

using System;
using System.Collections.Generic;
using System.Linq;

public static void Main(string[] args)
            {

                string one = "http://<site>/Non Archive/<document>";
                string two = "http://<site>/Archive/<document>";
                char delimiter = '/';
                List<string> list = new List<string> { one, two };
                string target = "Archive";

                foreach (string s in list)
                {
                    Console.WriteLine(s);
                }
                Console.WriteLine("after remove");

                list.RemoveAll(x => x.Split(delimiter).ToList().Any(y => y.Equals(target)));

                foreach (string s in list)
                {
                    Console.WriteLine(s);
                }


                Console.ReadLine();

            }

这就是我的意思。我了解您已经修复它。但这仍然可以指导其他有类似问题的人。

结果:enter image description here