1. Giriş
Kolleksiyalarla işləmək təkcə dövr etmək, filtrasiya və sortlama deyil. Çox vaxt bu kolleksiyaları dəyişmək və ya yenidən işləmək lazım olur ki, sənin ehtiyaclarına uyğun olsun: məsələn, sətirlər kolleksiyasını götürüb onu rəqəmlər kolleksiyasına çevirmək, siyahıdan dublikatları silmək və ya ümumiyyətlə məlumat strukturunu dəyişmək.
Bütün bu tapşırıqları kolleksiyaların standart metodları, sadə dövrlər və əsas alqoritmlərlə həll etmək olar. Bu, LINQ ilə müqayisədə bir az uzun olur, amma tam şəffafdır və kolleksiyaların necə işlədiyini başa düşmək üçün faydalıdır.
Kolleksiyaları dəyişməyin əsas yolları
Kolleksiyaları müxtəlif cür dəyişmək olar və çox vaxt aşağıdakı yanaşmalardan biri lazımdır:
- Məzmunun modifikasiyası: elementləri əlavə etmək, silmək və ya əvəzləmək.
- Elementlərin çevrilməsi: ilkin kolleksiyanı götürüb onun əsasında yeni — başqa strukturda, tipdə və ya formada kolleksiya almaq (məsələn, List<int>-dən List<string> düzəltmək).
- Təqdimatın dəyişdirilməsi: kolleksiyanı yenidən qurmaq — məsələn, sortlamaq, tərsinə çevirmək (reverse) və ya qruplaşdırmaq.
Biz əsasən birinci və ikinci qrupa fokuslanacağıq, çünki sortlama ayrıca mühazirədə ətraflı baxılıb.
Dəyişən və dəyişməz kolleksiyalar: vacib nüans
Yadda saxla ki, .NET-də bəzi kolleksiyaları sərbəst dəyişmək olur (məsələn, List<T>), bəzilərini isə olmur (IReadOnlyList<T>, yalnız oxumaq üçün olan massivlər və s.).
- Modifikasiya — konkret kolleksiyanı dəyişirik (məsələn, Add, Remove, Clear və s. ilə).
- Çevrilmə — orijinala toxunmuruq, yeni kolleksiya alırıq, adətən yeni siyahı yaradıb onu ilkin kolleksiyanın elementləri ilə doldururuq.
2. Kolleksiyaların məzmununun modifikasiyası
ICollection<T> interfeysini reallaşdıran bütün kolleksiyalar məzmunu dəyişmək üçün əsas metodlar verir. Gəlin bunu kitab kataloqu nümunəsində baxaq.
Elementlərin əlavə və silinməsi
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
public int Year { get; set; }
}
List<Book> books = new List<Book>
{
new Book { Title = "Təmiz kod", Author = "Robert Martin", Year = 2008 },
new Book { Title = "CLR vasitəsilə C#", Author = "Ceffri Rixtər", Year = 2012 }
};
// Yeni kitab əlavə etmək
books.Add(new Book { Title = "Head First C#", Author = "Endryu Stellman", Year = 2010 });
// Müəllifə görə kitabı silmək (məsələn)
for (int i = books.Count - 1; i >= 0; i--)
{
if (books[i].Author == "Robert Martin")
books.RemoveAt(i);
}
// Konkret obyekt silmək (əgər siyahıda varsa)
Book someBook = books[0];
books.Remove(someBook);
// Bütün kolleksiyanı təmizləmək
books.Clear();
// Elementi müəyyən mövqeyə əlavə etmək
books.Insert(0, new Book { Title = "Pro C# 9", Author = "Endryu Troelsen", Year = 2021 });
Elementlərin əvəzlənməsi və yenilənməsi
Tutaq ki, kimsə buraxılış ili ilə səhv edib. Bunu necə düzəltmək olar?
// Lazım olan kitabı dövr ilə tapıb ili düzəldirik
for (int i = 0; i < books.Count; i++)
{
if (books[i].Title == "Head First C#")
{
books[i].Year = 2018; // İli düzəltdik
break;
}
}
3. Kolleksiyaların çevrilməsi
Elementlərin tipinin çevrilməsi (məsələn, Book-dan string-ə)
Bütün kitab adlarının kolleksiyasını almaq:
List<string> bookTitles = new List<string>();
foreach (Book book in books)
{
bookTitles.Add(book.Title);
}
foreach (var title in bookTitles)
{
Console.WriteLine(title);
}
Bütün kitab illərini almaq:
List<int> bookYears = new List<int>();
foreach (Book book in books)
{
bookYears.Add(book.Year);
}
Yeni tip/struktur çevrilməsi:
public class BriefBookInfo
{
public string Title;
public int Year;
}
List<BriefBookInfo> briefInfos = new List<BriefBookInfo>();
foreach (Book book in books)
{
briefInfos.Add(new BriefBookInfo { Title = book.Title, Year = book.Year });
}
foreach (var info in briefInfos)
{
Console.WriteLine($"{info.Title} ({info.Year})");
}
Kolleksiyalar kolleksiyasını birinə çevirmək (flat map)
Əgər kitabda tag-lar siyahısı varsa, bütün tag-ların bir siyahısını almaq:
public class Book
{
public string Title { get; set; }
public List<string> Tags { get; set; }
}
List<Book> booksWithTags = new List<Book>
{
new Book { Title = "Təmiz kod", Tags = new List<string> { "Clean Code", "Refactoring" } },
new Book { Title = "CLR vasitəsilə C#", Tags = new List<string> { "CLR", "Internals" } }
};
List<string> allTags = new List<string>();
foreach (var book in booksWithTags)
{
foreach (var tag in book.Tags)
{
allTags.Add(tag);
}
}
foreach (string tag in allTags)
{
Console.WriteLine(tag);
}
4. Kolleksiyaların çevrilməsi üçün tez-tez istifadə olunan metodlar
ToArray
Siyahıdan massiv almaq üçün:
string[] bookTitlesArray = bookTitles.ToArray();
Distinct — dublikatlardan qurtuluruq
Unikal müəlliflər (LINQ olmadan):
List<string> authors = new List<string>();
foreach (Book book in books)
{
if (!authors.Contains(book.Author))
authors.Add(book.Author);
}
Reverse — kolleksiyanı tərsinə çeviririk
Sıralamanı tərsinə çevirmək üçün:
books.Reverse(); // yerində dəyişir!
Əgər orijinalı dəyişmək istəmirsənsə:
var reversed = new List<Book>(books);
reversed.Reverse();
Sıralama (sortlama mühazirəsinə bax)
books.Sort((a, b) => a.Year.CompareTo(b.Year)); // ilə görə sortlama
Sahə üzrə qruplaşdırma (GroupBy emulyasiyası)
Kitabları müəllifə görə qruplaşdırmaq (sözlük "müəllif — kitablar siyahısı" almaq):
Dictionary<string, List<Book>> booksByAuthor = new Dictionary<string, List<Book>>();
foreach (Book book in books)
{
if (!booksByAuthor.ContainsKey(book.Author))
booksByAuthor[book.Author] = new List<Book>();
booksByAuthor[book.Author].Add(book);
}
foreach (var pair in booksByAuthor)
{
Console.WriteLine($"Müəllif: {pair.Key}");
foreach (var b in pair.Value)
Console.WriteLine($" {b.Title}");
}
5. Faydalı nüanslar
- Dövr ilə çevrilmə əməliyyatları həmişə və hər yerdə işləyir.
- Dublikatlardan qurtulmaq üçün müvəqqəti kolleksiyalar və Contains/Add metodlarından istifadə et.
- foreach ilə dövr edərkən kolleksiyanı dəyişmə! Çoxlu element silmək lazımdırsa, əvvəlcə onları ayrıca siyahıda topla.
6. Tipik tapşırıq nümunələri
Müəyyən il üçün kitablar siyahısı almaq
List<Book> recentBooks = new List<Book>();
foreach (Book book in books)
{
if (book.Year > 2010)
recentBooks.Add(book);
}
foreach (var book in recentBooks)
{
Console.WriteLine($"{book.Title} ({book.Year})");
}
Bütün unikal nəşr illərini artan qaydada çıxarmaq
List<int> years = new List<int>();
foreach (Book book in books)
{
if (!years.Contains(book.Year))
years.Add(book.Year);
}
years.Sort();
foreach (int year in years)
Console.WriteLine(year);
Kitabları ixraca hazırlamaq (DTO siyahısı yaratmaq)
public class BookExport
{
public string Name;
public string Writer;
public int PublishedYear;
}
List<BookExport> booksForExport = new List<BookExport>();
foreach (Book book in books)
{
booksForExport.Add(new BookExport
{
Name = book.Title,
Writer = book.Author,
PublishedYear = book.Year
});
}
7. Tipik səhvlər və tələlər
Add, Remove, Clear, Insert və Sort kimi metodlar kolleksiyanı yerində dəyişir.
Əgər sənə yeni kolleksiya lazımdırsa — yeni siyahı yarat və ora lazım olan elementləri əlavə et.
Kolleksiyanı dövr edərkən elementləri siləndə sondan başlayaraq dövr et (for (int i = Count-1; i >= 0; i--)).
Əgər unikal elementlər siyahısı lazımdırsa, təkrarlara diqqət et: Contains və ya HashSet<T> istifadə et.
GO TO FULL VERSION