C# 从包含年份和小数点的对象列表中,将每年小数点最高的对象添加到新列表中

C# 从包含年份和小数点的对象列表中,将每年小数点最高的对象添加到新列表中,c#,list,linq,C#,List,Linq,我有一个班级 public class Region { public string Id { get; set; } public string Name { get; set; } public List<Participation> Participations { get; set; } } 每年有多个年份和多个条目,但我只想获取每年小数点最高的区域,对每个区域重复并将其添加到新列表中。因此,如果1950年有10个条目,我只想要所有条目中小数点最高的

我有一个班级

public class Region
{
    public string Id { get; set; }
    public string Name { get; set; }
    public List<Participation> Participations { get; set; }
}
每年有多个年份和多个条目,但我只想获取每年小数点最高的区域,对每个区域重复并将其添加到新列表中。因此,如果1950年有10个条目,我只想要所有条目中小数点最高的一个,或者如果平局的话,两者都要。我将所有区域存储在一个变量中

var regions = await GetRegionList();

IList<Region> TopRegions = new List<Region>();
var regions=await GetRegionList();
IList TopRegions=新列表();

我不确定是否应该使用正则表达式或LINQ,但在这两种方法上我都没有多大进展。我尝试在正则表达式中使用
Max()
方法,但在decimal上不允许使用,我不知道如何将
decimal.Round()
与正则表达式一起使用。

您的要求写得不是很清楚,但我认为这是您最终想要的:

IList<Region> TopRegions = regions
    .SelectMany(r => r.Participations)
    .GroupBy(p => p.Year)
    .Select(g =>
    {
        var max = g.Max(p => p.ParticipationPercentage);
        return g.Where(p => p.ParticipationPercentage == max)
                .Select(p => p.Region);
    })
    .SelectMany(r => r)
    .Distinct()
    .ToList();
IList TopRegions=区域
.SelectMany(r=>r.参与)
.GroupBy(p=>p.Year)
.选择(g=>
{
var max=g.max(p=>p.ParticipationPercentage);
返回g.Where(p=>p.ParticipationPercentage==max)
.选择(p=>p.Region);
})
.SelectMany(r=>r)
.Distinct()
.ToList();
这将获取原始区域列表,将其展平为所有参与的列表,并按年度列出这些组,然后查找每年的最大参与百分比,以及具有与该年最大参与率匹配的参与的区域列表。最后,将区域列表展平为单个列表,并删除重复的区域,留下表示“顶部区域”的不同区域的简单列表


Fiddle:

您的要求写得不是很清楚,但我认为这就是您最终想要的:

IList<Region> TopRegions = regions
    .SelectMany(r => r.Participations)
    .GroupBy(p => p.Year)
    .Select(g =>
    {
        var max = g.Max(p => p.ParticipationPercentage);
        return g.Where(p => p.ParticipationPercentage == max)
                .Select(p => p.Region);
    })
    .SelectMany(r => r)
    .Distinct()
    .ToList();
IList TopRegions=区域
.SelectMany(r=>r.参与)
.GroupBy(p=>p.Year)
.选择(g=>
{
var max=g.max(p=>p.ParticipationPercentage);
返回g.Where(p=>p.ParticipationPercentage==max)
.选择(p=>p.Region);
})
.SelectMany(r=>r)
.Distinct()
.ToList();
这将获取原始区域列表,将其展平为所有参与的列表,并按年度列出这些组,然后查找每年的最大参与百分比,以及具有与该年最大参与率匹配的参与的区域列表。最后,将区域列表展平为单个列表,并删除重复的区域,留下表示“顶部区域”的不同区域的简单列表


Fiddle:

这个问题并不清楚,但这里有一个正则表达式的例子

public void RegionTest()
    {
        var region1 = new Region() { Id = "L001", Name = "Local1", Participations = new List<Participation>() };
        var region2 = new Region() { Id = "L002", Name = "Local2", Participations = new List<Participation>() };
        var region3 = new Region() { Id = "L003", Name = "Local3", Participations = new List<Participation>() };

        var participant1 = new Participation() { Year = "2000", ParticipationPercentage = 90, RegionId = "A001", Region = region1 };
        var participant2 = new Participation() { Year = "2000", ParticipationPercentage = 85, RegionId = "A002", Region = region2 };
        var participant3 = new Participation() { Year = "2000", ParticipationPercentage = 80, RegionId = "A003", Region = region3 };
        var participant4 = new Participation() { Year = "2001", ParticipationPercentage = 70, RegionId = "B004", Region = region1 };
        var participant5 = new Participation() { Year = "2001", ParticipationPercentage = 80, RegionId = "B005", Region = region2 };

        region1.Participations = new List<Participation>() { participant1, participant4};
        region2.Participations = new List<Participation>() { participant2, participant5 };

        var topRegions = new List<Region>();
        var list1 = new List<decimal?>();
        var list2 = new List<decimal?>();

        foreach (var region in region1.Participations)
        {
            list1.Add(region.ParticipationPercentage);
            if ( region.ParticipationPercentage >= list1.Max())
            { topRegions.Add(region.Region); } 
        }
        foreach (var region in region2.Participations)
        {
            list2.Add(region.ParticipationPercentage);
            if (region.ParticipationPercentage >= list2.Max())
            { topRegions.Add(region.Region); }
        }
}
public void RegionTest()
{
var region1=new Region(){Id=“L001”,Name=“Local1”,Participations=new List()};
var region2=new Region(){Id=“L002”,Name=“Local2”,Participations=new List()};
var region3=new Region(){Id=“L003”,Name=“Local3”,Participations=new List()};
var participant1=新参与(){Year=“2000”,参与百分比=90,RegionId=“A001”,Region=region1};
var participant2=新参与(){Year=“2000”,参与百分比=85,RegionId=“A002”,Region=region2};
var participant3=新参与(){Year=“2000”,参与百分比=80,RegionId=“A003”,Region=region3};
var participant4=新参与(){Year=“2001”,参与百分比=70,RegionId=“B004”,Region=region1};
var participant5=新参与(){Year=“2001”,参与百分比=80,RegionId=“B005”,Region=region2};
region1.Participations=新列表(){participant1,participant4};
region2.Participations=新列表(){participant2,participant5};
var topRegions=新列表();
var list1=新列表();
var list2=新列表();
foreach(区域1中的var区域。参与)
{
列表1.添加(地区参与百分比);
如果(region.ParticipationPercentage>=list1.Max())
{topRegions.Add(region.region);}
}
foreach(区域2中的var区域。参与)
{
列表2.Add(地区参与百分比);
如果(region.ParticipationPercentage>=list2.Max())
{topRegions.Add(region.region);}
}
}

这个问题并不清楚,但这里有一个正则表达式示例

public void RegionTest()
    {
        var region1 = new Region() { Id = "L001", Name = "Local1", Participations = new List<Participation>() };
        var region2 = new Region() { Id = "L002", Name = "Local2", Participations = new List<Participation>() };
        var region3 = new Region() { Id = "L003", Name = "Local3", Participations = new List<Participation>() };

        var participant1 = new Participation() { Year = "2000", ParticipationPercentage = 90, RegionId = "A001", Region = region1 };
        var participant2 = new Participation() { Year = "2000", ParticipationPercentage = 85, RegionId = "A002", Region = region2 };
        var participant3 = new Participation() { Year = "2000", ParticipationPercentage = 80, RegionId = "A003", Region = region3 };
        var participant4 = new Participation() { Year = "2001", ParticipationPercentage = 70, RegionId = "B004", Region = region1 };
        var participant5 = new Participation() { Year = "2001", ParticipationPercentage = 80, RegionId = "B005", Region = region2 };

        region1.Participations = new List<Participation>() { participant1, participant4};
        region2.Participations = new List<Participation>() { participant2, participant5 };

        var topRegions = new List<Region>();
        var list1 = new List<decimal?>();
        var list2 = new List<decimal?>();

        foreach (var region in region1.Participations)
        {
            list1.Add(region.ParticipationPercentage);
            if ( region.ParticipationPercentage >= list1.Max())
            { topRegions.Add(region.Region); } 
        }
        foreach (var region in region2.Participations)
        {
            list2.Add(region.ParticipationPercentage);
            if (region.ParticipationPercentage >= list2.Max())
            { topRegions.Add(region.Region); }
        }
}
public void RegionTest()
{
var region1=new Region(){Id=“L001”,Name=“Local1”,Participations=new List()};
var region2=new Region(){Id=“L002”,Name=“Local2”,Participations=new List()};
var region3=new Region(){Id=“L003”,Name=“Local3”,Participations=new List()};
var participant1=新参与(){Year=“2000”,参与百分比=90,RegionId=“A001”,Region=region1};
var participant2=新参与(){Year=“2000”,参与百分比=85,RegionId=“A002”,Region=region2};
var participant3=新参与(){Year=“2000”,参与百分比=80,RegionId=“A003”,Region=region3};
var participant4=新参与(){Year=“2001”,参与百分比=70,RegionId=“B004”,Region=region1};
var participant5=新参与(){Year=“2001”,参与百分比=80,RegionId=“B005”,Region=region2};
region1.Participations=新列表(){participant1,participant4};
region2.Participations=新列表(){participant2,participant5};
var topRegions=新列表();
var list1=新列表();
var list2=新列表();
foreach(区域1中的var区域。参与)
{
列表1.添加(地区参与百分比);
如果(注册