62,074
社区成员
发帖
与我相关
我的任务
分享
var list = new List<temp>
{
new temp {id = 1, name = "c1", result = 0.1},
new temp {id = 1, name = "c1", result = 0.2},
new temp {id = 2, name = "c2", result = 0.1},
new temp {id = 2, name = "c2", result = 0.2},
new temp {id = 3, name = "c2", result = 0.3}
};
var groupBy = list.GroupBy(t => t.result).ToList();
var query = from l in list
group l by new { l.id, l.name } into m
select new
{
id = m.Key.id,
name = m.Key.name,
result = m.Select(n => { return new { key = "result" + (groupBy.FindIndex(r => r.Key == n.result) + 1).ToString(), value = n.result }; })
.ToDictionary(e => e.key, e => e.value)
};
string title = "id{0}name{0}";
int index = 0;
var groupByStr = groupBy.Select(r => "result" + (++index).ToString()).ToArray();
Console.WriteLine(title + string.Join("\t", groupByStr), "\t");
foreach (var q in query)
{
Console.WriteLine(string.Format("{0}\t{1}\t{2}", q.id, q.name,
string.Join("\t",
groupByStr.Select(
r =>
q.result.Keys.Contains(r) ? q.result[r].ToString() : "")
.ToArray())));
}
var query=from l in list
group l by new{l.id,l.name} into m
select new
{
id=m.Key.id,
name=m.Key.name,
result=m.Select(n=>n.result).ToArray()
};
//这样写 更好一些
var query=from l in list
group l by new{l.id,l.name} into m
let m1=m.FirstOrDefault()
let m2=m.LastOrDefault()
select new
{
id=m.Key.id,
name=m.Key.name,
result1=m1==null?0.0:m1.result,
result2=m2==null?0.0:m2.result
};
void Main()
{
var list=new List<temp>{
new temp{ id=1,name="c1", result=0.1},
new temp{ id=1,name="c1", result=0.2},
new temp{ id=2,name="c2", result=0.1},
new temp{ id=2,name="c2", result=0.2}
};
var query=from l in list
group l by new{l.id,l.name} into m
select new
{
id=m.Key.id,
name=m.Key.name,
result1=m.First().result,
result2=m.Last().result
};
Console.WriteLine("id\tname\tresult1\tresult2");
foreach(var q in query)
{
Console.WriteLine(string.Format("{0}\t{1}\t{2}\t{3}",q.id,q.name,q.result1,q.result2));
}
/*
id name result1 result2
1 c1 0.1 0.2
2 c2 0.1 0.2
*/
}
class temp
{
public int id{get;set;}
public string name{get;set;}
public double result{get;set;}
}