C#根据列表中匹配的数据从子列表中获取值
有一种情况,我有一个包含另一个列表的列表,有一个字符串在两个级别上都匹配,并且只返回两个列表中匹配的值 例如: 类别:“A”包含产品“A”、“B”和“AA” 类别:“B”包含产品“BA”、“C”和“D” 类别:“”包含产品“A”、“B” 如果我的输入参数是A,那么结果应该是: 产品为“A”和“AA”的“A”类 类别“”与产品“A” 如果我的输入为B,结果应为: “B”类,产品为“BA” 类别“”与产品“B” 到目前为止,我所做的是:C#根据列表中匹配的数据从子列表中获取值,c#,list,linq,C#,List,Linq,有一种情况,我有一个包含另一个列表的列表,有一个字符串在两个级别上都匹配,并且只返回两个列表中匹配的值 例如: 类别:“A”包含产品“A”、“B”和“AA” 类别:“B”包含产品“BA”、“C”和“D” 类别:“”包含产品“A”、“B” 如果我的输入参数是A,那么结果应该是: 产品为“A”和“AA”的“A”类 类别“”与产品“A” 如果我的输入为B,结果应为: “B”类,产品为“BA” 类别“”与产品“B” 到目前为止,我所做的是: result = AllCustomListValues.
result = AllCustomListValues.
Where(c => c.CategoryName.ToLower().Contains(searchTextInput.ToLower())
|| c.CategoryName == ""
).ToList();
foreach (var value in result)
{
if (value.CategoryName == "")
{
foreach (var CustomList in value.CustomLists)
{
if (!CustomList.ListName.ToLower().Contains(searchTextInput.ToLower()))
CustomListToRemove.Add(CustomList);
}
foreach (var ListToRemove in CustomListToRemove)
value.CustomLists.Remove(ListToRemove);
}
}
这里,AllCustomListValues包含整个数据,即包含子列表的列表(包含自定义列表的类别列表)。我在类别级别匹配输入文本字符串,然后获取第一组匹配类别,在第二个级别,我尝试获取与输入文本字符串不匹配的自定义列表数据,然后添加该数据,然后从主类别列表的子列表(即自定义列表)中删除该数据,这一切都很好,但似乎是非常详尽和严格的,我正在寻找一个更容易和灵活的选择。我不知道你为什么要做
如果(value.CategoryName==“”)
在你的第二个级别,所以我跳过了它(请随意添加回来)。
我还认为,删除子项会改变AllCustomListValues
变量,这可能是不可取的
您可以尝试以下方法:
searchTextInput = searchTextInput.ToLower(); // just so we only do it once.
AllCustomListValues.SelectMany(cat => cat.CustomLists, (cat, product) => new { cat.CategoryName, product.ListName, product}) // basically we flatten the Product structure and expose properties to search and rebuild our list later
.Where(c => c.CategoryName.ToLower().Contains(searchTextInput) || c.CategoryName == "" || c.ListName.ToLower().Contains(searchTextInput)) // apply your filters here to both Category and Filter
.GroupBy(i => i.CategoryName) // reconstructing your hierarchy
.Select(g => new Category {CategoryName = g.Key, CustomLists = g.Select(p => p.product).ToList() } )
.ToList();
到目前为止你试过什么?当然。你想要哪个站台?WinForms、WPF、UMP?你有什么代码可以开始吗?我正在使用.NETMVC