首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

求一linq查询,得到如上结果

2013-01-08 
求一linq查询,得到如下结果public partial class Default2 : System.Web.UI.Page{protected void Page_Loa

求一linq查询,得到如下结果

public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        IList<Area> list = new List<Area>();
        list.Add(new Area() { Uid=1, Pid=0, Name="电信" });
        list.Add(new Area() { Uid=2, Pid=0, Name="联通" });
        list.Add(new Area() { Uid=3, Pid=0, Name="移动" });
        list.Add(new Area() { Uid=4, Pid=1, Name="电信一区" });
        list.Add(new Area() { Uid=5, Pid=1, Name="电信二区" });
        // 用linq查询得到 uid、name
        // name中显示父级-子级-子子级。。。。,只要最后一级
        // 结果:
        //uid                 name                                        
        //2                    联通                          
        //3                    移动                              
        //4                    电信-电信一区                                 
        //5                    电信-电信二区
    }
}


public class Area
{
    public int Uid { get; set; }
    public int Pid { get; set; }// 父ID
    public string Name { get; set; }
}

[解决办法]

void Main()
{
 IList<Area> list = new List<Area>();
list.Add(new Area() { Uid=1, Pid=0, Name="电信" });
list.Add(new Area() { Uid=2, Pid=0, Name="联通" });
list.Add(new Area() { Uid=3, Pid=0, Name="移动" });
list.Add(new Area() { Uid=4, Pid=1, Name="电信一区" });
list.Add(new Area() { Uid=5, Pid=1, Name="电信二区" });

var query=from  l in list


          select new 
{
  Uid=l.Uid,
  Name=l.Pid==0?l.Name : list.First(m=>m.Uid==l.Pid).Name+"-"+l.Name
};
 
}
public class Area
{
public int Uid { get; set; }
public int Pid { get; set; }// 父ID
public string Name { get; set; }
}


[解决办法]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Area> list = new List<Area>();
            list.Add(new Area() { Uid = 1, Pid = 0, Name = "电信" });
            list.Add(new Area() { Uid = 2, Pid = 0, Name = "联通" });
            list.Add(new Area() { Uid = 3, Pid = 0, Name = "移动" });
            list.Add(new Area() { Uid = 4, Pid = 1, Name = "电信一区" });
            list.Add(new Area() { Uid = 5, Pid = 1, Name = "电信二区" });
            list.Add(new Area() { Uid = 6, Pid = 5, Name = "电信二区之一" });
            Func<int, int> FindRoot = (x) => x;
            FindRoot = (x) => list.First(y => y.Uid == x).Pid == 0 ? list.First(y => y.Uid == x).Uid : FindRoot(list.First(y => y.Uid == x).Pid);
            var query = from l in list
                        select new
                        {
                            Uid = l.Uid,
                            Name = l.Pid == 0 ? l.Name : list.First(m => m.Uid == FindRoot(l.Uid)).Name + "-" + l.Name
                        };
            foreach (var item in query)


            {
                Console.WriteLine(item.Uid + "," + item.Name);
            }
        }
    }

    class Area
    {
        public int Uid { get; set; }
        public int Pid { get; set; }
        public string Name { get; set; }
    }
}



1,电信
2,联通
3,移动
4,电信-电信一区
5,电信-电信二区
6,电信-电信二区之一
Press any key to continue . . .
[解决办法]

            IList<Area> list = new List<Area>();
            list.Add(new Area() { Uid = 1, Pid = 0, Name = "电信" });
            list.Add(new Area() { Uid = 2, Pid = 0, Name = "联通" });
            list.Add(new Area() { Uid = 3, Pid = 0, Name = "移动" });
            list.Add(new Area() { Uid = 4, Pid = 1, Name = "电信一区" });
            list.Add(new Area() { Uid = 5, Pid = 1, Name = "电信二区" });
            list.Add(new Area() { Uid = 6, Pid = 0, Name = "Test" });
            list.Add(new Area() { Uid = 7, Pid = 6, Name = "Test1" });
            list.Add(new Area() { Uid = 8, Pid = 7, Name = "Test11" });

            Console.WriteLine("uid\t\tname");
            foreach (var area in list.Where(a => !list.Any(l => l.Pid == a.Uid)))
            {
                Console.WriteLine("{0}\t\t{1}", area.Uid, area.Name);
            }

            Console.ReadLine();


uid                  name                                        
2                    联通                          


3                    移动                              
4                    电信-电信一区                                 
5                    电信-电信二区
8                    Test11
[解决办法]
晕,看了阿非的程序才明白你说的只要最后一级是什么意思。

一个优秀的程序员应该学会设计良好的,覆盖主要情况和边界条件的测试用例。很明显,你没有设计多于2级的情况的用例。

其实这个用linq做并不太好。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Area> list = new List<Area>();
            list.Add(new Area() { Uid = 1, Pid = 0, Name = "电信" });
            list.Add(new Area() { Uid = 2, Pid = 0, Name = "联通" });
            list.Add(new Area() { Uid = 3, Pid = 0, Name = "移动" });
            list.Add(new Area() { Uid = 4, Pid = 1, Name = "电信一区" });
            list.Add(new Area() { Uid = 5, Pid = 1, Name = "电信二区" });
            list.Add(new Area() { Uid = 6, Pid = 5, Name = "电信二区之一" });
            list.Add(new Area() { Uid = 7, Pid = 0, Name = "Test" });
            list.Add(new Area() { Uid = 8, Pid = 7, Name = "Test1" });
            list.Add(new Area() { Uid = 9, Pid = 8, Name = "Test11" });
            list.Add(new Area() { Uid = 10, Pid = 9, Name = "Test111" });

            Func<Tuple<int, string>, Tuple<int, string>> FindRoot = (x) => x;
            FindRoot = 
                (x) => 


                    list.First(y => y.Uid == x.Item1).Pid == 0 ? 
                    new Tuple<int, string>(list.First(y => y.Uid == x.Item1).Uid, list.First(y => y.Uid == x.Item1).Name + "-" + x.Item2) :
                    FindRoot(new Tuple<int, string>(list.First(y => y.Uid == x.Item1).Pid, list.First(y => y.Uid == x.Item1).Name + "-" + x.Item2));
            var query = from x in list
                        where !list.Any(y => y.Pid == x.Uid)
                        select new
                        {
                            Uid = x.Uid,
                            Name = x.Pid == 0 ? x.Name : FindRoot(new Tuple<int, string>(x.Uid, "")).Item2.TrimEnd('-')
                        };
            foreach (var item in query)
            {
                Console.WriteLine(item.Uid + "," + item.Name);
            }
        }
    }

    class Area
    {
        public int Uid { get; set; }
        public int Pid { get; set; }
        public string Name { get; set; }
    }
}



2,联通
3,移动
4,电信-电信一区
6,电信-电信二区-电信二区之一
10,Test-Test1-Test11-Test111
Press any key to continue . . .

热点排行