读书人

求一linq查询得到如上结果

发布时间: 2013-01-08 14:02:13 作者: rapoo

求一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 . . .

读书人网 >.NET

热点推荐