现在所看到的游戏信息,都是从一个表里取出来的,我用的是存储过程,我的控制器为
#region 获取所有游戏信息 /// <summary> /// 获取所有游戏信息 /// </summary> /// <returns></returns> public PartialViewResult SelectAllGame() { IndexProvider indexProvid = new IndexSqlProvider(); DataTable dt = indexProvid.GameInfo_SelectGame(); List<GameInfoModels> list = new List<GameInfoModels>(); foreach (DataRow row in dt.Rows) { GameInfoModels model = new GameInfoModels(); model.ID = Convert.ToInt32(row["ID"]); model.GameName = row["GameName"].ToString(); model.FirstChar = row["FirstChar"].ToString(); model.GameIsHot =(bool)row["GameIsHot"]; model.GameIsRecommand=(bool)row["GameIsRecommand"]; list.Add(model); } return PartialView(list); } #endregion
这个存储过程是取出所有游戏信息,至于筛选游戏时,用的条件便是在前台写的
<div style="display: block;" id="games_1" class="tabContent"> @foreach (var item in Model.Where(m => m.GameIsRecommand == true)) { @Html.ActionLink(@item.GameName, "SelectGameArea", "IBuy", new { name =@item.GameName },null) } </div> <div style="display: none;" id="games_2" class="tabContent"> @foreach (var item in Model.Where(m => m.GameIsRecommand == true)) { @Html.ActionLink(@item.GameName, "SelectGameArea", "IBuy", new { name = @item.GameName }, null) } </div>
转会正题,问题便是:怎么去除重复的信息?
先清楚哪个字段重复算重复
LINQ的方法,ID重复算重复的话这样,按ID分下小组,每组取第一个就行了:
List<GameInfoModel> gameInfoModels1 = list.GroupBy(i => i.ID).Select(g=>g.First()).ToList();
GameName重复算重复的话,这样写:
List<GameInfoModel> gameInfoModels1 = gameInfoModels.GroupBy(i => i.GameName).Select(g=>g.First()).ToList();
这种方式要引入命名空间的,using System.Linq; 其实LINQ to Object也有直接的去重复方法。Distinct<TSource>(),不过因为你的对象是引用类型,它默认判断是对象的引用是否相等,所以两个new的对象,即使字段都相等也会被看作不相等的。你可以override你那个Model的Equals方法和GetHashCode方法或者实现IEqualityComparer<T>自定义一个判断相等的规则,说清楚怎么算重复,ID相等算重复名称相等算重复还是所有字段都相等才算重复。然后下面代码就行了:
GameInfoModel[] gameInfoModels1 = gameInfoModels.Distinct().ToArray();
比较好理解的方法就是,在你那个foreach循环外建个字典,用来存储你判断重复的字段,例如ID。然后在循环里判断是否已存在,存在就别Add了。
List<GameInfoModel> list = new List<GameInfoModel>(); Dictionary<int, object> dictionary = new Dictionary<int, object>(); foreach (DataRow row in dt.Rows) { int id = Convert.ToInt32(row["ID"]); if (!dictionary.ContainsKey(id)) { GameInfoModels model = new GameInfoModels(); model.ID = id; model.GameName = row["GameName"].ToString(); model.FirstChar = row["FirstChar"].ToString(); model.GameIsHot = (bool)row["GameIsHot"]; model.GameIsRecommand = (bool)row["GameIsRecommand"]; list.Add(model); dictionary.Add(id, null); } }
不建字典也可以的。
List<GameInfoModel> list = new List<GameInfoModel>(); foreach (DataRow row in dt.Rows) { int id = Convert.ToInt32(row["ID"]); if (!list.Exists(i=>i.ID == id)) { GameInfoModels model = new GameInfoModels(); model.ID = id; model.GameName = row["GameName"].ToString(); model.FirstChar = row["FirstChar"].ToString(); model.GameIsHot = (bool)row["GameIsHot"]; model.GameIsRecommand = (bool)row["GameIsRecommand"]; list.Add(model); } }
不过我觉得最好你在SQL里一次就distinct了,何必折腾两次呢?方法有很多种,根据你具体情况定吧!
存储过程取出的数据是所有数据,包括重复的,而这一块需要用不重复的,还有一个页面需要用到重复的,我想他们共用一个存储过程,所以就只能把条件加到各自的控制器中。。。谢谢你的解答,太好了。。。
大哥,你肿么可以这样厉害呢!崇拜你呀!解决了我的问题!么么哒!
用LINQ对list进行去重