获取列表中数字的最高平均值

时间:2016-05-17 06:22:13

标签: c# linq

在我的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类实现此功能?这是通过一个学生名单,计算他们的平均分数,并返回平均最高的学生。感谢

3 个答案:

答案 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)));
}