вторник, 9 февраля 2010 г.

Linq: Как получить из одного списка объектов пронумерованный?

Возникла задача получить из списка объектов (IList<People>) другой, а именно пронумерованный (IDictionary<int,People>). Те получить некоторый аналог ROWNUM (Oracle) или ROWNUMBER (MS SQL Server).

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

namespace Linq.test
{
class Program
{
static void Main(string[] args)
{
// источник записей
var mans = new[] {
new People { Name = "John", Age = 23 },
new People { Name = "Bob", Age = 12 },
new People { Name = "Bill", Age = 43 },
new People { Name = "Patrick", Age = 69 }
};

// посмотрим что там в списке ;-)
foreach (var man in mans)
{ Console.WriteLine(man.ToString()); }

// получаем проиндексированный список
var counteredMan = GetIndexed(mans);

// собственно выводим его в консоль
foreach (var item in counteredMan)
{ Console.WriteLine(item.Key + " - " + item.Value); }

Console.ReadLine();
}

/// <summary>
///
Получение пронумерованного списка
/// </summary>
/// <param name="pupils"></param>
/// <returns></returns>
private static IDictionary<int, People> GetIndexed(IEnumerable<People> pupils)
{
return pupils.Select((man, i) => new
{
id = i+1,
man = man
}).ToDictionary(key => key.id, val => val.man);
}
}

/// <summary>
///
Объект для опытов
/// </summary>
public class People
{
public string Name { get; set; }
public int Age { get; set; }

public override string ToString()
{ return "Гражданин " + Name + ", возраст: " + Age; }
}
}

Комментариев нет: