Asp.net mvc MVC CSV导入和计算

Asp.net mvc MVC CSV导入和计算,asp.net-mvc,linq,Asp.net Mvc,Linq,我有一个MVC应用程序,可以在其中导入具有特定结构的.csv文件。视图按预期呈现数据。我现在需要计算目标差异,并确定目标差异最小的团队 我已经在模型中进行了目标差计算,它是有效的,这可能不是最好的地方,所以任何建议都会受到欢迎。我真正需要的帮助是识别目标差异中int值最低的团队,然后在视图中显示该团队名称 控制器 using CSVImport.Models; using System; using System.Collections.Generic; using System.Linq; u

我有一个MVC应用程序,可以在其中导入具有特定结构的.csv文件。视图按预期呈现数据。我现在需要计算目标差异,并确定目标差异最小的团队

我已经在模型中进行了目标差计算,它是有效的,这可能不是最好的地方,所以任何建议都会受到欢迎。我真正需要的帮助是识别目标差异中int值最低的团队,然后在视图中显示该团队名称

控制器

using CSVImport.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.IO;

namespace CSVImport.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new List<Team>());
        }

        [HttpPost]
        public ActionResult Index(HttpPostedFileBase postedFile)
        {
            try
            {

                List<Team> teams = new List<Team>();
                string filePath = string.Empty;
                if (postedFile != null)
                {
                    string path = Server.MapPath("~/Uploads/");
                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                    }

                    filePath = path + Path.GetFileName(postedFile.FileName);
                    string extension = Path.GetExtension(postedFile.FileName);
                    postedFile.SaveAs(filePath);
                            
                    //Loop through rows skip the header row
                    foreach (string row in csvData.Split('\r', '\n').Skip(1))
                    {
                        if (!string.IsNullOrEmpty(row))
                        {
                            teams.Add(new Team
                            {
                                TeamName = row.Split(',')[0],
                                Played = Convert.ToInt32(row.Split(',')[1]),
                                Won = Convert.ToInt32(row.Split(',')[2]),
                                Loss = Convert.ToInt32(row.Split(',')[3]),
                                Draw = Convert.ToInt32(row.Split(',')[4]),
                                GoalsFor = Convert.ToInt32(row.Split(',')[5]),
                                GoalsAgainst = Convert.ToInt32(row.Split(',')[6]),
                                Points = Convert.ToInt32(row.Split(',')[7])                                
                            });    
                        }
                    }
                }
                return View(teams);
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
                return View("Error");
            }
        }
    }
}

如果你认为
GoalsFor
goalscountry是一个
团队
的属性,为什么
goalsdifference`不是一个属性呢?我唯一要做的就是简化属性:

public int Difference => this.GoalsFor - this.GoalsAgainst;
或者如果您使用的是旧版本的C#

我真正需要的帮助是识别目标差异中int值最低的团队,然后在视图中显示该团队名称

要找到GoalDifference值最低的团队,您需要有一组团队。这可能是一个
列表
,或
团队[]
,但实际上任何可枚举的团队序列都可以

班级团队不是这样做的合适场所。此类不表示团队序列

如果您有一系列团队,那么很容易找到差异最小的团队:

IEnumerable<Team> teams = ...
Team teamWithLowestDifference = teams.OrderBy(team => team.Difference)
                                     .FirstOrDefault();

请注意:如果有两支球队的差距相等或最小,则不能保证你得到的是哪支球队。我想这不是问题,因为您刚才说的是差异最小的团队。

谢谢您的帮助。我坐在这里,在与世隔绝的过程中感到无聊,并试图磨练我的技能。至于你回答的第一部分,我只是不确定计算部分是否应该在控制器而不是模型中进行。你的一条线肯定干净多了。当使用扩展时,这是我要添加到控制器中的东西,还是我应该使用单独的模型来实现这一点?还有,我该如何在视图中调用这个?我曾尝试使用@Team.LowestDifferenceOrDefault,但它给了我一个对象引用错误。因此,我将视图中的调用更改为
@{CSVImport.Controllers.TeamExtensions.LowestDifferenceOrDefault(this.Model);}
这将消除错误。另一方面,扩展方法返回它遇到的第一个团队,该团队不是差异最小的团队。事实上,它不会遍历
foreach
块。此外,团队名称也不会返回到视图中。我以前告诉过你:团队不是一个序列。如果您有一系列团队,如列表或数组,则只能要求差异最小的团队。如果你只有一个团队,那么这个团队是差异最小的团队。我认为这不是你的问题:在某个地方你有一群团队。关于位置:由于这是团队集合的扩展,请将其放在您拥有团队集合的位置,或者如果您没有集合类,请将其放在团队附近。毕竟,那不是人们寻找它的地方吗?
public int Difference { get {return this.GoalsFor - this.GoalsAgainst;} }
IEnumerable<Team> teams = ...
Team teamWithLowestDifference = teams.OrderBy(team => team.Difference)
                                     .FirstOrDefault();
Team  Difference
  A      4
  B      5
  C      2      <== lowest Difference
  D      3
public static class TeamExtensions
{
    public Team LowestDifferenceOrDefault(this IEnumerable<Team> teams)
    {
        int lowestDifference = int.MaxValue;
        Team teamWithLowestDifference = null;

        foreach (var team in teams)
        {
            if (team.Difference < lowestDifference)
            {
                 teamWithLowestDifference = team;
                 lowestDifference = team.Difference;
            }
        }
        return teamWithLowestDifference;
    }
}
List<Team> myTeams = ...
Team teamWithLowestDifference = myTeams.LowestDifferenceOrDefault();
Team newYorkTeamWithLowestDifference = myTeams
    .Where(team => team.Location == "New York")
    .LowestDifferenceOrDefault();