获取与最高平均十进制值关联的字符串
本文关键字:关联 字符串 十进制 高平 获取 | 更新日期: 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;
}