Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#列表<;字符串>;包含来自其他列表的部分匹配项<;字符串>;_C#_.net_List - Fatal编程技术网

C#列表<;字符串>;包含来自其他列表的部分匹配项<;字符串>;

C#列表<;字符串>;包含来自其他列表的部分匹配项<;字符串>;,c#,.net,list,C#,.net,List,我有以下清单: var list1 = new List<string> { "BOM_Add", "BOM_Edit", "BOM_Delete", "Paper_Add", "Paper_Edit", "Paper_Delete" }; var list2 = new List<string> {"BOM", "Paper_Add"}; 因为第二个列表包含“BOM” 如果第二个列表包含“_Edit”,那么我希望第三个

我有以下清单:

var list1 = new List<string>
{
    "BOM_Add",
    "BOM_Edit",
    "BOM_Delete",
    "Paper_Add",
    "Paper_Edit",
    "Paper_Delete"
};

var list2 = new List<string> {"BOM", "Paper_Add"};
因为第二个列表包含“BOM”

如果第二个列表包含“_Edit”,那么我希望第三个列表具有

"BOM_Edit",
"Paper_Edit"
我知道如何使用
.Intersect()
,如果我在第二个列表中拼写出每个项目(例如“BOM\u添加”),但我需要它比这更灵活

这可以在不遍历第一个列表中的每个项目的情况下完成吗?这些列表可能会很长,如果可以的话,我宁愿避免这样做。

您可以使用LINQ

var result = list1.Where(r => list2.Any(t => r.Contains(t)))
                  .ToList();
对于输出:

foreach (var item in result)
{
    Console.WriteLine(item);
}
产出将是:

BOM_Add
BOM_Edit
BOM_Delete
Paper_Add
这是否可以在不遍历第一个项目的情况下完成 名单

您必须通过循环或使用LINQ(也可以在内部进行迭代)进行迭代

这可以在不遍历第一个列表中的每个项目的情况下完成吗

否,如果要查找包含您拥有的某个项目的所有项目。没有办法建立一个索引,或者任何一种结构,可以在不检查每个项目的情况下排除项目的大部分。唯一的选择是将第一个列表中的每个项目与另一个列表中的每个项目进行比较,进行
包含
检查


如果只需要执行
StartsWith
而不是
Contains
,则可以对列表进行排序,执行
BinarySearch
以查找与正在搜索的项目最近的项目,这将允许您轻松查找以特定字符串开头的所有项目,而实际上只需要检查O(log)(n) +m)项(其中n是列表的大小,
m
是平均匹配数)。如果您只是根据字符串的倒数对项目进行排序,那么您也可以对带有
结尾进行同样的操作,但是无法对项目进行排序,从而使
包含
复选框可以执行此操作。

如果您希望避免重复列表,那么您需要了解更多关于列表中的内容以及如何比较它们。list始终排序?子字符串总是在字符串的开头找到吗?在某个点上,即使有点LINQ,也必须在列表中进行迭代(它仍然会遍历封面下的项目)。
BOM_Add
BOM_Edit
BOM_Delete
Paper_Add