Я думаю, что это также может быть решено в SQL, но если вы хотите сделать это программно, я протестировал в LinqPad следующее:
void Main()
{
var list = new List<Tuple<string,int>> {
Tuple.Create("x", 10),
Tuple.Create("x", 42),
Tuple.Create("x", 643),
Tuple.Create("y", 5),
Tuple.Create("y", 9),
Tuple.Create("y", 70),
};
var result =
from grp in list.GroupBy(t => t.Item1)
let firstThree = grp.Select(t => t.Item2).Take(3).ToList()
select new {
Key = grp.Key,
Value1 = firstThree[0],
Value2 = firstThree[1],
Value3 = firstThree[2] };
foreach (var item in result)
Console.WriteLine(item);
}
Предполагается, что у вас есть по крайней мере три элемента, в противном случае вы получите исключение вне диапазона.
Хотя конечный результат является анонимным типом, вы могли бы вместо этого легко передать результаты операции в DataRow.