在我的WCF界面中,我有一个
的类定义[DataContract]
public class Student
{
[DataMember]
public int Sid { get; set;}
[DataMember]
public string StudentName { get; set;}
[DataMember]
public int M1 { get; set;}
[DataMember]
public int M2 { get; set; }
[DataMember]
public int M3 { get; set; }
}
我有这个方法
[OperationContract]
Student GetTopper(List<Student> LS);
上述方法应收集<Student>
类型的列表,计算每个学生的M1,M2和M3的平均值,并返回平均值最高的学生。
这就是我目前对GetTopper方法的实现看起来像
public Student GetTopper(List<Student> LS)
{
foreach (Student s in LS)
{
double Avg = (s.M1 + s.M2 + s.M3) / 3.0;
}
}
如何使用GetTopper类实现此功能?这是通过一个学生名单,计算他们的平均分数,并返回平均最高的学生。感谢
答案 0 :(得分:6)
您可以使用desc命令然后通过linq获取第一个
public Student GetTopper(List<Student> LS)
{
if(LS == null) return null;
return LS.OrderByDescending(s => (s.M1 + s.M2 + s.M3) / 3.0).FirstOrDefault();
}
修改强>
/ 3.0
应该是多余的,通过得分最高或最高平均确定最佳学生是一样的>得分。感谢Dmitry Bychenko的回答。
答案 1 :(得分:4)
您正在寻找 arg max 实施;不需要排序,一个简单的foreach
循环就可以了:
public Student GetTopper(IEnumerable<Student> value) {
if (null == value)
throw new ArgumentNullException("value");
boolean first = true;
Student result = null;
double maxValue = double.NegativeInfinity;
foreach (var item in value) {
if (null == item)
continue;
// there's no need to divide by 3, providing that M1, M2, M3
// are small enough not to trigger integer overflow
if (first || item.M1 + item.M2 + item.M3 > maxValue) {
first = false;
maxValue = item.M1 + item.M2 + item.M3;
result = item;
}
}
return result;
}
答案 2 :(得分:0)
public Student GetTopper(List<Student> LS)
{
return LS.FirstOrDefault(s => ((s.M1 + s.M2 + s.M3) / 3.0).Equals(LS.Max(m => (m.M1 + m.M2 + m.M3) / 3.0)));
}