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