写了一个很简单的demo,你看看啦 //测试groupby List<Person> list = GetList(); var arr3 = list.GroupBy(x => x.Id).Select(p => new { id = p.Key, nums = p.Count() }); foreach (var item in arr3) { Console.WriteLine(item.id + "counts:" + item.nums); } 准备数据: public static List<Person> GetList() { List<Person> list = new List<Person> {
new Person{Id="1",Name="百二",Data=7}, new Person{Id="2",Name="擦",Data=8}, new Person{Id="3",Name="发",Data=11}, new Person{Id="2",Name="大",Data=10}, new Person{Id="3",Name="俄",Data=12}, new Person{Id="1",Name="阿一",Data=1} }; return list; }
google 搜索“SQL 行转列” 你的列是固定的?直接用几个case就行了
static void Main(string[] args) { //化学0x100000 //机械0x010000 List<ArrayList> mylist = new List<ArrayList>() { new ArrayList(){001,"热卷箱",4,"化学成份报告"}, new ArrayList() { 001, "热卷箱", 4, "焊接报告" }, new ArrayList() { 001, "热卷箱", 4, "机械报告" }, new ArrayList() { 002, "热卷箱", 1, "机械报告" } }; List<ArrayList> myResult = new List<ArrayList>(); var ss = mylist.GroupBy(r => r[0]); foreach (var a in ss) { ArrayList oneResult = new ArrayList(); oneResult.Add(a.Key); bool firstIN = true; //合并数目 int recordCount = a.Count(r => { if (firstIN) { //相同字条 oneResult.Add(r[1]); oneResult.Add(r[2]); firstIN = false; } oneResult.Add(r[3]); return true; }); oneResult.Add(recordCount); myResult.Add(oneResult); } //输出 myResult.ForEach(r => { foreach (var one in r) { Console.Write("{0} ||", one); } Console.WriteLine(); }); Console.ReadKey(); } 自我感觉写的好丑,但我向来不怕丑,提出自己看法只求提高自己水平,第一用的是ArrayList而不是泛型实体类,太多的装箱拆箱很损性能,第二报告类型可以用[Flags] enum 然后按条件与是否会漂亮一些。第三太多的foreach,不知道怎么精减
List<Person> list = GetList(); var arr3 = list.GroupBy(x => x.Id).Select(p => new { id = p.Key, nums = p.Count() });
foreach (var item in arr3)
{
Console.WriteLine(item.id + "counts:" + item.nums);
}
准备数据: public static List<Person> GetList()
{
List<Person> list = new List<Person>
{
new Person{Id="1",Name="百二",Data=7},
new Person{Id="2",Name="擦",Data=8},
new Person{Id="3",Name="发",Data=11},
new Person{Id="2",Name="大",Data=10},
new Person{Id="3",Name="俄",Data=12},
new Person{Id="1",Name="阿一",Data=1}
};
return list;
}
你的列是固定的?直接用几个case就行了
{
//化学0x100000 //机械0x010000
List<ArrayList> mylist = new List<ArrayList>()
{
new ArrayList(){001,"热卷箱",4,"化学成份报告"},
new ArrayList() { 001, "热卷箱", 4, "焊接报告" },
new ArrayList() { 001, "热卷箱", 4, "机械报告" },
new ArrayList() { 002, "热卷箱", 1, "机械报告" }
};
List<ArrayList> myResult = new List<ArrayList>();
var ss = mylist.GroupBy(r => r[0]);
foreach (var a in ss)
{
ArrayList oneResult = new ArrayList();
oneResult.Add(a.Key);
bool firstIN = true;
//合并数目
int recordCount = a.Count(r =>
{
if (firstIN)
{
//相同字条
oneResult.Add(r[1]);
oneResult.Add(r[2]);
firstIN = false;
}
oneResult.Add(r[3]);
return true;
}); oneResult.Add(recordCount);
myResult.Add(oneResult);
}
//输出
myResult.ForEach(r =>
{
foreach (var one in r)
{ Console.Write("{0} ||", one); }
Console.WriteLine(); });
Console.ReadKey();
}
自我感觉写的好丑,但我向来不怕丑,提出自己看法只求提高自己水平,第一用的是ArrayList而不是泛型实体类,太多的装箱拆箱很损性能,第二报告类型可以用[Flags] enum 然后按条件与是否会漂亮一些。第三太多的foreach,不知道怎么精减
我好纠结啊.....