none
使用Linq对IList进行排序 RRS feed

  • 问题

  • 我要对一个IList进行排序,我是这样做的

    list = (from i in list orderby i.ID).ToList();

    list中装的是实体类,我对它进行排序然后重新赋值给它,这样的做法有没有问题?

    然后加入list中装的实体类是这样子的

    class A

    {

    public int ID{get;set;}

    public IList<B> Bs{get;set;}

    }

    class B

    {

    public int ID{get;set;}

    }

    现在我要对list中的A的id进行排序,然后对每个A中的B集合的ID进行排序。就是说排好序后的list中是这样的:

    {{1:ID, {1:ID}}, {1:ID, {2:ID}}, {1:ID, {3:ID}},...,{2:ID, {1:ID}}, {2:ID, {2:ID}}...}

    我现在采用的笨方法是先循环list,对每个A中的B进行排序得到新的IList覆盖原来的引用,循环完后再对A的ID进行排一次序。

    能否通过一条Linq语句高效优雅地解决?

    注:我是在内存中排序,非数据库

    2011年6月24日 15:10

答案

  • 我要对一个IList进行排序,我是这样做的

    list = (from i in list orderby i.ID).ToList();

    list中装的是实体类,我对它进行排序然后重新赋值给它,这样的做法有没有问题?

    然后加入list中装的实体类是这样子的

    class A

    {

    public int ID{get;set;}

    public IList<B> Bs{get;set;}

    }

    class B

    {

    public int ID{get;set;}

    }

    现在我要对list中的A的id进行排序,然后对每个A中的B集合的ID进行排序。就是说排好序后的list中是这样的:

    {{1:ID, {1:ID}}, {1:ID, {2:ID}}, {1:ID, {3:ID}},...,{2:ID, {1:ID}}, {2:ID, {2:ID}}...}

    我现在采用的笨方法是先循环list,对每个A中的B进行排序得到新的IList覆盖原来的引用,循环完后再对A的ID进行排一次序。

    能否通过一条Linq语句高效优雅地解决?

    注:我是在内存中排序,非数据库


    你好,你完全可以这样做:

    namespace TestConsoleApplication1
    {
        class A
        {

            public int ID { get; set; }

            public IList<B> Bs { get; set; }

        }

        class B
        {

            public int ID { get; set; }

        }


        class Program
        {
            static void Main(string[] args)
            {
              //模拟数据
                List<A> As = new List<A>();
                Random r = new Random(DateTime.Now.Millisecond);

                for (int i = 1; i < 11; i++)
                {
                    A a = new A();
                    a.ID = r.Next(1, 11);
                    List<B> Bs = new List<B>();
                    Thread.Sleep(2);

                    for (int j = 0; j < 11; j++)
                    {
                        B b = new B();
                        b.ID = r.Next(1, 11);
                        Bs.Add(b);
                        Thread.Sleep(2);
                    }
                    a.Bs = Bs;
                    As.Add(a);
                }

                var result = (from e in As
                              orderby e.ID
                              select new A
                              {
                                  ID = e.ID,
                                  Bs = e.Bs.OrderBy(b => b.ID).ToList()
                              }).ToList();

                //输出
                foreach (var item in result)
                {
                    Console.Write(item.ID+":");
                    foreach (var j in item.Bs)
                    {
                        Console.Write(j.ID+" ");
                    }
                    Console.WriteLine();
                }
                            
            }

        }

    }


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请讨论
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    • 已标记为答案 Behindmoon 2011年6月25日 3:40
    2011年6月25日 2:21