1

我正在开发一个 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;
    }

我想要做的是返回一个字符串。与最高平均 currentSalary 关联的 SalaryInformation 对象的职业属性。请记住,有几个 SalaryInformation 对象具有共同的职业值(例如,三个 SalaryInformation 对象在财产专业上具有值“医生”)。

我从这种方法开始,我被困在这里:

 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;
    }

如果您需要更多代码和详细信息,请告诉我,我会将其添加到此线程中。

4

5 回答 5

2

尝试使用LINQ

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

这应该可以解决问题。

于 2013-07-01T21:00:28.080 回答
0

这将使您获得收入最高的职业(平均工资)

        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;
        }
于 2013-07-01T23:05:24.700 回答
0

尝试以下(使用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;
于 2013-07-01T20:56:59.893 回答
0

尝试这个。

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;
    }
}
于 2013-07-01T20:54:28.740 回答
0
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;
于 2013-07-01T20:59:34.100 回答