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