关于GroupBy分组的问题

jiushiyi2017 2019-06-04 01:50:57
List<Order> orderList = new List<Order>
{
new Order { Id=1, GoodsList=new List<Goods>{ new Goods{ Name="商品1",Qty=5}}},
new Order { Id=2, GoodsList=new List<Goods>{ new Goods{ Name="商品2",Qty=6},new Goods{Name="商品3",Qty=7 }}},
new Order { Id=3, GoodsList=new List<Goods>{ new Goods{ Name="商品2",Qty=6},new Goods{Name="商品3",Qty=7 }}},
new Order { Id=4, GoodsList=new List<Goods>{ new Goods{ Name="商品1",Qty=8}}},
new Order { Id=5, GoodsList=new List<Goods>{ new Goods{ Name="商品1",Qty=5}}},
};

想要按GoodsList分组,就是Order .GoodsList一样的 分成一组, Id:1和 Id:5 一组, Id:2和 Id:3 一组,Id:4数量不一样,不能和1、5分在一组;

var _Group=orderList.GroupBy(x => x.GoodsList).ToArray();

得到的结果不对!可能是GoodsList之间无法比较值!使用IEqualityComparer<T>也不行 ! 各位大神帮忙看下,怎样写获取结果!感谢!

...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiushiyi2017 2019-06-04
  • 打赏
  • 举报
回复



引用 8 楼 听雨停了 的回复:

好吧!
这个方法要用到的 而已必须是0
//这方法好像用不到,还不清楚,不过得实现它,嘿嘿
public int GetHashCode(List<Goods> obj)
{
return 0;
}

这个必须是0,
我用的是 return obj.GetHashCode(); 结果是5行了
听雨停了 2019-06-04
  • 打赏
  • 举报
回复
听雨停了 2019-06-04
  • 打赏
  • 举报
回复
引用 6 楼 jiushiyi2017 的回复:
不对! 得到的结果还是 5行!
我这里显示的是三条,你那里五条就不知道什么情况了
jiushiyi2017 2019-06-04
  • 打赏
  • 举报
回复
引用 2 楼 听雨停了 的回复:

var list = orderList.GroupBy(o => o.GoodsList, new OrderEqualityComparer()).Select(o=>o.First()).ToList();

public class OrderEqualityComparer : IEqualityComparer<List<Goods>>
{
public bool Equals(List<Goods> x, List<Goods> y)
{
bool flag = false;
if (x.Count!=y.Count)
{
return false;
}

for (int i = 0; i < x.Count; i++)
{
if (x[i].Name.Equals(y[i].Name) && x[i].Qty.Equals(y[i].Qty))
{
flag = true;
}
else
{
return false;
}
}
return flag;
}

//这方法好像用不到,还不清楚,不过得实现它,嘿嘿
public int GetHashCode(List<Goods> obj)
{
return 0;
}
}

尝试了一下好像可以达到你说的效果,学习中


不对!
得到的结果还是 5行!
  • 打赏
  • 举报
回复
引用 3 楼 jiushiyi2017 的回复:
[quote=引用 1 楼 好奇都是要学的 的回复:] 你这个是2层 是按照 GoodsList 的Qty 分组
有时候 GoodsList 的Qty 一样 , GoodsList 的Name 不一样,必须是GoodsList 都一样才能分一组[/quote] 先不管语法 , 你回SQL 吗? 你这个 按数量分组 就是3行。 如果按照 name和 qtn分组 就还是 5行。 这个懂了后 在去看linq to where语法 分组后要给 一个新的LIST<T> 集合。
  • 打赏
  • 举报
回复
GoodsList只看集合内的第一个分组?集合有超过一个Goods的就不管后面的了?
jiushiyi2017 2019-06-04
  • 打赏
  • 举报
回复
引用 1 楼 好奇都是要学的 的回复:
你这个是2层 是按照 GoodsList 的Qty 分组


有时候 GoodsList 的Qty 一样 , GoodsList 的Name 不一样,必须是GoodsList 都一样才能分一组
听雨停了 2019-06-04
  • 打赏
  • 举报
回复

var list = orderList.GroupBy(o => o.GoodsList, new OrderEqualityComparer()).Select(o=>o.First()).ToList();

    public class OrderEqualityComparer : IEqualityComparer<List<Goods>>
    {
        public bool Equals(List<Goods> x, List<Goods> y)
        {
            bool flag = false;
            if (x.Count!=y.Count)
            {
                return false;
            }

            for (int i = 0; i < x.Count; i++)
            {
                if (x[i].Name.Equals(y[i].Name) && x[i].Qty.Equals(y[i].Qty))
                {
                    flag = true;
                }
                else
                {
                    return false;
                }                
            }
            return flag;
        }

        //这方法好像用不到,还不清楚,不过得实现它,嘿嘿
        public int GetHashCode(List<Goods> obj)
        {
            return 0;
        }
    }
尝试了一下好像可以达到你说的效果,学习中
  • 打赏
  • 举报
回复
你这个是2层 是按照 GoodsList 的Qty 分组

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧