Junior
რა ტიპის ობიექტებს შეიძლება გამოიყენოთ C#-ში foreach ციკლში?
sobes.tech AI
პასუხი AI-სგან
C#-ში foreach ციკლს შეუძლია გამოიყენოს ნებისმიერი ობიექტის ტიპი, რომელიც რეალიზებს ერთ-ერთ შემდეგ ინტერფეისს:
System.Collections.IEnumerable- არაპროგრამული კოლექციებისთვის. უზრუნველყოფს არაპროგრამული ენუმატორისIEnumerator-ს.System.Collections.Generic.IEnumerable<T>- უნივერსალური კოლექციებისთვის. უზრუნველყოფს უნივერსალური ენუმატორისIEnumerator<T>-ს.
კლასი ან სტრუქტურა ასევე შეიძლება გამოყენებულ იქნას foreach-ში, თუ მათ აქვთ საჯარო მეთოდი GetEnumerator(), რომელიც აბრუნებს ამგვარ ობიექტს, რომელიც რეალიზებს შემდეგ სიგნატურას (ეს სახელდება pattern-based foreach):
- საჯარო თვისება
Current, რომელიც აბრუნებს ნებისმიერ ტიპს. - საჯარო მეთოდი
MoveNext(), რომელიც აბრუნებსbool-ს. - ოპციონალურად, საჯარო მეთოდი
Dispose()(სწორი რესურსების გათავისუფლებისთვისusing-ის გამოყენებისას).
მაგალითები ინტეგრირებულ ტიპებზე:
- მასივები (
int[],string[]და ა.შ.) System.Collectionsსივრცის კოლექციები:ArrayList,Hashtable,Queue,Stack.System.Collections.Genericსივრცის კოლექციები:List<T>,Dictionary<TKey, TValue>,HashSet<T>,Queue<T>,Stack<T>.- სტრიქონები (
string) - ისინი სიმბოლოთა სერიააchar.
მომხმარებლის ტიპის მაგალითი, რომელიც მხარს უჭერს foreach-ს:
// მარტივი მომხმარებლის ტიპი, რომელიც მხარს უჭერს `foreach`
public class MyEnumerable
{
private int[] data = { 1, 2, 3, 4, 5 };
// GetEnumerator მეთოდი, რომელიც მხარს უჭერს `foreach`
public MyEnumerator GetEnumerator()
{
return new MyEnumerator(data);
}
// შიდა კლასი - ენუმერატორი
public class MyEnumerator
{
private int[] data;
private int currentIndex = -1;
public MyEnumerator(int[] data)
{
this.data = data;
}
// `Current` თვისება
public int Current => data[currentIndex];
// `MoveNext` მეთოდი
public bool MoveNext()
{
currentIndex++;
return currentIndex < data.Length;
}
// `Dispose` მეთოდი (ოპციონალური)
public void Dispose()
{
// რესურსების განთავისუფლება, თუ საჭიროა
}
}
}
// გამოყენება `foreach`-ში
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
// // Console.WriteLine(item);
// }