我有这些清单:
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_Add",
"BOM_Edit",
"BOM_Delete",
"Paper_Add"
因为第二个列表包含“BOM”。
如果第二个列表包含“_Edit”,那么我希望第三个列表包含
"BOM_Edit",
"Paper_Edit"
如果我在第二个列表中拼出每个项目(例如“BOM_Add”),我知道如何使用.Intersect()
执行此操作,但我需要它比这更灵活。
这可以在不重复第一个列表中的每个项目的情况下完成吗?这些列表可能会很长,如果可以,我宁愿避免这样做。
答案 0 :(得分:5)
您可以使用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 (内部迭代)进行迭代
答案 1 :(得分:1)
这可以在不重复第一个列表中的每个项目的情况下完成吗?
不,如果您要查找包含其中一个项目的所有项目。无法构建索引或任何可以排除大部分项目而无需检查每个项目的结构。唯一的选择是将第一个列表中的每个项目与另一个列表中的每个项目进行比较,进行Contains
检查。
如果您只需要StartsWith
代替Contains
,那么您可以对列表进行排序,执行BinarySearch
查找最近的项目到您正在搜索的项目,这将允许您轻松找到以特定字符串开头的所有项目,而实际上只需要检查O(log(n)+ m)项目(其中n是列表的大小m
是平均匹配数)。你也可以使用EndsWith
做同样的事情,如果你只是根据字符串的反面对项目进行排序,但是没有办法对项目进行排序,以便进行Contains
检查此