C# 如何一次为所有应用准备数据,而不为每个应用循环?

C# 如何一次为所有应用准备数据,而不为每个应用循环?,c#,C#,我有一个包含2个过滤器的主列表,该列表与一个应用程序链接 var filterData = new List<FilterData> { new FilterData { Filter1 = "test1", Filter2 = "X", GoesToApp = "App1"}, new FilterData { Filter1 = &q

我有一个包含2个过滤器的主列表,该列表与一个应用程序链接

var filterData = new List<FilterData>
            {
                new FilterData { Filter1 = "test1", Filter2 = "X", GoesToApp = "App1"},
                new FilterData { Filter1 = "test2", Filter2 = "X", GoesToApp = "App2"},
                new FilterData { Filter1 = "test2", Filter2 = "Y", GoesToApp = "App1"},
                new FilterData { Filter1 = "test3", Filter2 = "Y", GoesToApp = "App3"},
                new FilterData { Filter1 = "test4", Filter2 = "Y", GoesToApp = "App3"},
                new FilterData { Filter1 = "test1", Filter2 = "Z", GoesToApp = "App1"},
            };
在这里,我需要使用主列表(上面)在
Filter1
Filter2
上过滤
数据
,并需要为每个应用程序(App1、App2等)准备数据

使用下面的代码,我一次只能为一个应用程序准备数据(例如,
App1
),这将根据比较的过滤器为我提供所需的数据

var destData = new Data()
            {
                Id = 1,
                FilterValues = new List<FilterValue>()
            };

            var filter1DataForApp1 = filterData.Where(item =>
                    item.GoesToApp == "App1" && data.Filter2.Contains(item.Filter2))
                .Select(item => item.Filter1);


            foreach (var f1 in filter1DataForApp1)
            {
                destData.FilterValues.AddRange(data.FilterValues.Where(a => a.Filter1 == f1));
            }
的预期输出数据

App1(仅测试1和测试2)

var app1Data=新数据
{
Id=1,
Filter2=null,
FilterValues=新列表
{
新的FilterValue{Filter1=“test1”,Value=“1”},
新的FilterValue{Filter1=“test2”,Value=“2”}
}
};
App2(仅测试2)

var app1Data=新数据
{
Id=1,
Filter2=null,
FilterValues=新列表
{
新的FilterValue{Filter1=“test2”,Value=“2”}
}
};
等等


我需要一个类似于
List

的结果,我想您需要的是这样的结果:

var result = filterData.GroupBy(x => x.GoesToApp).ToDictionary(grp => grp.Key, grp => {        
        return new Data 
        {
            Id = 1,
            FilterValues = grp.Where(item => data.Filter2.Contains(item.Filter2)).SelectMany(item => data.FilterValues.Where(f => item.Filter1 == f.Filter1)).ToList() 
        };
    });
    
foreach(var item in result)
{
    Console.WriteLine(item.Key);
    foreach(var fv in item.Value.FilterValues)
        Console.WriteLine($"\t{fv.Filter1}");
}

活生生的例子:

数据与GoesToApp有什么关系?你能告诉我你的预期结果是什么吗。。。不完全清楚。
Id=1
是否参考
App1
?那么,您是否正在寻找一组引用您的3个应用程序的
destData
?谢谢@Jamiec,请查看我对每个应用程序的预期输出app@HereticMonkey,
Data
有多个
Filter1
,我需要将其拆分到右侧的
AppToGoes
。谢谢。谢谢,但我还需要
GoesToApp
信息。类似于
List
@user584018的信息。好的,请参阅更新-只需返回一本以
GesToApp
为键的字典。它的优点是您可以执行
result[“App1”]
例如super Sir。杰出的你能给我解释一下逻辑吗?@user584018这个逻辑和你原来的完全一样,只是首先按
GoesToApp
进行分组,这样你就可以返回它们的列表了
public class FilterData
    {
        public string Filter1 { get; set; }
        public string Filter2 { get; set; }
        public string GoesToApp { get; set; }
    }

    public class Data
    {
        public int Id { get; set; }
        public List<string> Filter2 { get; set; }
        public List<FilterValue> FilterValues { get; set; }
    }

    public class FilterValue
    {
        public string Filter1 { get; set; }
        public string Value { get; set; }
    }
var app1Data = new Data
        {
            Id = 1,
            Filter2 = null,
            FilterValues = new List<FilterValue>
            {
                new FilterValue {Filter1 = "test1", Value = "1"},
                new FilterValue {Filter1 = "test2", Value = "2"}
            }
        };
var app1Data = new Data
        {
            Id = 1,
            Filter2 = null,
            FilterValues = new List<FilterValue>
            {
                new FilterValue {Filter1 = "test2", Value = "2"}
            }
        };
var result = filterData.GroupBy(x => x.GoesToApp).ToDictionary(grp => grp.Key, grp => {        
        return new Data 
        {
            Id = 1,
            FilterValues = grp.Where(item => data.Filter2.Contains(item.Filter2)).SelectMany(item => data.FilterValues.Where(f => item.Filter1 == f.Filter1)).ToList() 
        };
    });
    
foreach(var item in result)
{
    Console.WriteLine(item.Key);
    foreach(var fv in item.Value.FilterValues)
        Console.WriteLine($"\t{fv.Filter1}");
}