获取与最高平均十进制值关联的字符串

本文关键字:关联 字符串 十进制 高平 获取 | 更新日期: 2023-09-27 18:20:41

我正在开发一个windows窗体应用程序,用于计算和显示存储在文本文件中的薪资统计信息。

我现在有一项任务有问题:计算哪个职业的当前平均工资最高。

我已经将每个薪资统计信息存储为SalaryInformation对象。我将向您展示SalaryInformation类的外观:

public sealed class SalaryInformation
{
    private string profession;
    private int yearOfEmployment;
    private decimal startSalary;
    private decimal currentSalary;
    public string Profession
    {
        get { return profession; }
        set { profession = value; }
    }
    public int YearOfEmployment
    {
        get { return yearOfEmployment; }
        set { yearOfEmployment = value; }
    }
    public decimal StartSalary
    {
        get { return startSalary; }
        set { startSalary = value; }
    }

    public decimal CurrentSalary
    {
        get { return currentSalary; }
        set { currentSalary = value; }
    }
    public SalaryInformation()
    { }
    public SalaryInformation(string p, int yoe, decimal startS, decimal currentS)
    {
        profession = p;
        yearOfEmployment = yoe;
        startSalary = startS;
        currentSalary = currentS;
    }

我想做的是返回一个字符串。与当前最高平均薪资相关联的SalaryInformation对象的职业属性。请记住,有多个SalaryInformation对象具有共同的职业值(例如,三个SalaryInfo对象在房地产职业上的值为"doctor")。

我从这个方法开始,但我被困在了这里:

 public string GetHighestPaidProfession()
    {
        string highestPaidProfession = "";
        //Gets all the salaryInformation objects and stores them in a list
        List<SalaryInformation> allSalaries = new List<SalaryInformation>();
        allSalaries = data.GetSalaryInformation();          

        //Right here I don't know how to do the rest from here.
        //I realize that I have to calculate the average currentsalary from every
        //SalaryInformation I got in the list allSalaries. But then I have to
        //to get the actual profession which has the highest average currentsalary
        //among them. It's right there I get stuck.
        return highestPaidProfession;
    }

如果你需要更多的代码和细节,请告诉我,我会把它添加到这个线程中。

获取与最高平均十进制值关联的字符串

尝试使用LINQ:

return allSalaries.GroupBy(s => s.Profession)
                  .OrderByDescending(g => g.Average(n => n.CurrentSalary))
                  .FirstOrDefault().Key;

这应该奏效。

allSalaries = data.GetSalaryInformation(); 
var averageCurrentSalaries = allSalaries.GroupBy(
    si => si.Profession, 
    si => si, 
    (key, g) => new 
    { 
         Profession = key, 
         AverageCurrentSalary = g.Average(si => si.CurrentSalary);
    });
var highestPaidProfession = averageCurrentSalaries.OrderByDescending(
    as => as.AverageCurrentSalary).First().Profession;

尝试以下(使用Linq)

 allSalaries = data.GetSalaryInformation(); 
 var allSalariesByProfession = allSalaries.GroupBy(x=>x.Profession);
 var averageSalariesByProfession = allSalariesByProfession.Select(group => new {Profession = group.Key, Avg=group.Average(item=>item.CurrentSalary));
 var highestPayingprofession = averageSalariesByProfession.OrderByDescending(x=>x.Avg).First().Key;

试试这个。

void Main()
{
    var allSalaries = new List<SalaryInformation> {
    new SalaryInformation("doctor", 1, 100, 120), 
    new SalaryInformation("doctor", 1, 120, 150), 
    new SalaryInformation("engineer", 1, 50, 100)};
    var profession = allSalaries.GroupBy (s => s.Profession)
    .Select (s => new {Profession = s.Key, SalaryAvg = s.Average (x => x.CurrentSalary)})
    .OrderByDescending (g => g.SalaryAvg)
    .FirstOrDefault().Profession;
    Console.WriteLine(profession);
}
public class SalaryInformation
{
    private string profession;
    private int yearOfEmployment;
    private decimal startSalary;
    private decimal currentSalary;
    public string Profession
    {
        get { return profession; }
        set { profession = value; }
    }
    public int YearOfEmployment
    {
        get { return yearOfEmployment; }
        set { yearOfEmployment = value; }
    }
    public decimal StartSalary
    {
        get { return startSalary; }
        set { startSalary = value; }
    }

    public decimal CurrentSalary
    {
        get { return currentSalary; }
        set { currentSalary = value; }
    }
    public SalaryInformation()
    { }
    public SalaryInformation(string p, int yoe, decimal startS, decimal currentS)
    {
        profession = p;
        yearOfEmployment = yoe;
        startSalary = startS;
        currentSalary = currentS;
    }
}

这将为您带来收入最高的职业(平均工资)

        public string GetHighestPaidProfession()
        {
            //string highestPaidProfession = ""; no need for the string variable.
            //Gets all the salaryInformation objects and stores them in a list
            //just added this elements to list for demonstration only.
            List<SalaryInformation> allSalaries = new List<SalaryInformation>()
            {
                new SalaryInformation("doctor",2010,500.00m,585.00m),
                new SalaryInformation("doctor",2010,500.00m,585.00m),
                new SalaryInformation("doctor",2010,500.00m,550.00m),
                new SalaryInformation("doctor",2010,500.00m,550.00m),
                new SalaryInformation("manager",2010,400.00m,510.00m),
                new SalaryInformation("manager",2010,400.00m,490.00m),
                new SalaryInformation("manager",2010,400.00m,500.00m),
                new SalaryInformation("manager",2010,400.00m,480.00m),
                new SalaryInformation("director",2010,600.00m,625.00m),
                new SalaryInformation("director",2010,600.00m,615.00m)
            };
            Dictionary<string,List<decimal>> results = new Dictionary<string,List<decimal>>();
            foreach(SalaryInformation si in allSalaries)
            {
                if(results.ContainsKey(si.Profession))
                {
                    results[si.Profession].Add(si.CurrentSalary);
                }
                else
                {
                    results.Add(si.Profession,new List<decimal>(){si.CurrentSalary});
                }
            }
            //this will result in dictionary<string,decimal>,where the dedimal will
            //already be the average of all salary of each profession.
            var result = results.ToDictionary(k => k.Key, v => v.Value.Sum() / v.Value.Count);
            //returns the string in result dictionary which points to the
            //highest value.
            return result.Aggregate((l, r) => l.Value > r.Value ? l : r).Key;
        }