Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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#_List_Linq - Fatal编程技术网

C#根据列表中匹配的数据从子列表中获取值

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.

有一种情况,我有一个包含另一个列表的列表,有一个字符串在两个级别上都匹配,并且只返回两个列表中匹配的值

例如: 类别:“A”包含产品“A”、“B”和“AA” 类别:“B”包含产品“BA”、“C”和“D” 类别:“”包含产品“A”、“B”

如果我的输入参数是A,那么结果应该是: 产品为“A”和“AA”的“A”类 类别“”与产品“A”

如果我的输入为B,结果应为: “B”类,产品为“BA” 类别“”与产品“B”

到目前为止,我所做的是:

 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