C#中的Foreach(currentScope中的类变量)

本文关键字:类变量 currentScope 中的 Foreach | 更新日期: 2023-09-27 18:30:03

在C#中,是否可以在一个范围内声明类的各种实例,然后使用foreach循环处理它们?

示例:

void generateInstances()
{
    myClass element1 = new myClass();
    myClass element2 = new myClass();
    myClass element3 = new myClass();
    foreach (myClass e in currentScope)
    {
        e.doSomething();
    }
}

C#中的Foreach(currentScope中的类变量)

正如大家所说,您必须使用集合来实现这一点,例如:

void generateInstaces()
{    
    myClass element1 = new myClass();
    myClass element2 = new myClass();
    myClass element3 = new myClass();
    var myCollection = new List<myClass>{ element1, element2, element3 };
    foreach (myClass e in myCollection)
    {
        e.doSomething();
    }
}

或者您可以从方法的参数接收集合

void generateInstaces(IList<myClass> myCollection)
{
    foreach (myClass e in myCollection)
         e.doSomething();    
}

我认为这是可能的。

下面是code architecture。。

public class DemoClass
{
    //static List<DemoClass> _currentList = null;
    static List<DemoClass> _currentList = new List<DemoClass>();
    static bool _isScopeStarted = false;
    public DemoClass()
    {
        if (_isScopeStarted)
        {
            _currentList.Add(this);
        }
    }
    public int a { get; set; }
    public int b { get; set; }
    public static IEnumerable<DemoClass> ScopeObjects
    {
        get
        {
            return _currentList;
        }
    }
    public int Sum()
    {
        return a + b;
    }
    public static void StartScope()
    { 
        //_currentList = new List<DemoClass>();            
        _isScopeStarted = true;
    }
    public static void EndScope()
    {
        //_currentList = null;
        _isScopeStarted = false;
        _currentList = new List<DemoClass>();
    }

现在unit testing部分

class Program
{
    static void Main(string[] args)
    {
        //When no scope defined
        DemoClass alone1 = new DemoClass();
        DemoClass alone2 = new DemoClass();
        Console.WriteLine(DemoClass.ScopeObjects.Count());
        //When scope is defined
        DemoClass.StartScope();
        DemoClass demo1 = new DemoClass { a = 10, b = 20 };
        DemoClass demo2 = new DemoClass { a = 11, b = 22 };
        Console.WriteLine(DemoClass.ScopeObjects.Count());
        //Here is your for each
        foreach (var item in DemoClass.ScopeObjects)
        {
            Console.WriteLine(item.Sum());
        }
        DemoClass.EndScope();
        Console.ReadKey();
    }

@Tiziano检查它是否适合您的curiosity满意的

我认为这是不可能的。

您必须先将对象添加到集合中,然后在集合上进行foreach循环。

在一个列表中可以有很多这样的实例:

void generateInstaces()
{
    List<myClass> elements = new List<myClass>();
    for (int i = 0; i < 100; i ++)
        elements.Add(new myClass());
    foreach (myClass e in elements)
    {
        e.doSomething();
    }
}

根据你的评论,你可以做:

void generateInstaces()
{
    List<myClass> elements = new List<myClass>();
    elements.Add(new myClass(1, "99a"));
    elements.Add(new myClass(17, "hta"));
    elements.Add(new myClass(9, "fff"));
    foreach (myClass e in elements)
    {
        e.doSomething();
    }
}

如果所有实例都属于同一类,即"myClass",则u可以创建该类类型的列表。

然后将所有实例添加到此列表中,如:

void generateInstaces()
{
   List<myClass> myClassList = new List<myClass>();
   myClass element1 = new myClass();
   myClass element2 = new myClass();
   myClass element3 = new myClass();
   myClassList.add(element1);
   myClassList.add(element2);
   myClassList.add(element3);
   foreach (myClass mc in myClassList)
   {
       mc.doSomething();
   }
}

如果所有实例都属于同一类,即"myClass",则这是可能的。

如果实例是不同的类,那么您需要创建一个对象类型列表,如下所示:

void generateInstaces()
{
   List<object> myClassList = new List<object>();
   FirstClass element1 = new FirstClass();
   SecondClass element2 = new SecondClass();
   ThirdClass element3 = new ThirdClass();
   myClassList.add(element1);
   myClassList.add(element2);
   myClassList.add(element3);
   foreach (object mc in myClassList)
   {
       if(mc.GetType() == "FirstClass")
       {
           //Do something
       }
       else if(mc.GetType() == "SecondClass")
       {
           //Do something
       }
       else if(mc.GetType() == "ThirdClass")
       {
           //Do something
       }
   }
}