co.de.mon.key

Weblog

C# Generowanie obiektów z zakresu - Enumerable.Range()

| Comments

Czasami zachodzi potrzeba utworzenia kolekcji liczb/obiektów na podstawie zdefiniowanego zakresu liczbowego.

Zamiast definiowania tablicy oraz używania pętli:

 

1
2
3
4
5
6
7
public static List<YearClass> LoadData()
{
  List<YearClass> years = new List<YearClass>();
  for (int i = 2000; i < 2015; i++)
    years.Add(new YearClass(i));
  return years;
}

można wykorzystać Enumerable.Range(int, int) link MSDN

1
2
3
4
public static List<YearClass> LoadData()
{
 return Enumerable.Range(2000, 15).Select(x => new YearClass(x)).ToList<YearClass>();
}

Prawda że ładniej? Może nie jest to itertools z Pythona ale robi to co trzeba.

Oczywiście metodę można wykorzystać do tworzenia różnego rodzaju ciągów:

1
2
3
4
5
6
7
8
9
10
11
// ciąg arytmetyczny
var seq1 = Enumerable.Range(0, 5).Select(x => x * 3 + 2).ToList();
// 2, 5, 8, 11, 14

// kwadraty
var seq2 = Enumerable.Range(1, 6).Select(x => x * x).ToList();
// 1, 4, 9, 16, 25, 36

// potęgi dwójki
var seq3 = Enumerable.Range(0, 10).Select(x => (int)Math.Pow(2, x)).ToList();
// 1, 2, 4, 8, 16, 32, 64, 128, 256, 512

również znakowych:

1
2
var percentStrArray = Enumerable.Range(0, 10).Select(x => (10 * x) + "%" ).ToArray();
// "0%", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%"

Eksperymentalne pobieranie wszystkich małych liter ASCII wygląda następująco:

1
2
var smallASCII = Enumerable.Range((int)'a', (int)'z' - (int)'a' + 1).Select(x => (char)x).ToArray();
// 'a', 'b', 'c', ..., 'y', 'z'

Comments