首页 新闻 会员 周边 捐助

一个关于asp.net mvc3中distinct去重复的问题

0
悬赏园豆:5 [已解决问题] 解决于 2013-09-09 09:16

现在所看到的游戏信息,都是从一个表里取出来的,我用的是存储过程,我的控制器为

#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>

转会正题,问题便是:怎么去除重复的信息?

"程序猿"~在路上的主页 "程序猿"~在路上 | 初学一级 | 园豆:162
提问于:2013-09-06 18:16
< >
分享
最佳答案
1

先清楚哪个字段重复算重复

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了,何必折腾两次呢?方法有很多种,根据你具体情况定吧!

收获园豆:5
C#开发人员 | 初学一级 |园豆:181 | 2013-09-07 21:06

存储过程取出的数据是所有数据,包括重复的,而这一块需要用不重复的,还有一个页面需要用到重复的,我想他们共用一个存储过程,所以就只能把条件加到各自的控制器中。。。谢谢你的解答,太好了。。。

"程序猿"~在路上 | 园豆:162 (初学一级) | 2013-09-09 09:15

大哥,你肿么可以这样厉害呢!崇拜你呀!解决了我的问题!么么哒!

今年过年前瘦8斤 | 园豆:94 (初学一级) | 2014-09-03 10:37
其他回答(1)
0

用LINQ对list进行去重

dudu | 园豆:29737 (高人七级) | 2013-09-07 12:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册