如何创建一个可以迭代的类集合

本文关键字:迭代 集合 何创建 创建 一个 | 更新日期: 2023-09-27 17:49:15

我有一系列对象的属性,这些属性本身就是一个类:

private ClassThing Thing1;
private ClassThing Thing2;
private ClassThing Thing3;
private class ClassThing
{
    public string Name;
    public int Foos;
}

在某些领域,我需要能够专门访问每一处房产,例如:

label1.Text = Thing1.Name;

然而,也希望创建一个foreach循环来访问每一个循环,如下所示:

string CombinedString;
foreach(ClassThing Thing in SomeCollection)
{
    CombinedString += Thing.Name;
}

最终结果必须是可序列化的XML这些例子非常基础,但我希望它们能更容易地证明我的需要。

我尝试创建一个包含这些属性的字典,但是字典是不可XML序列化的。我想简单地让所有这些属性成为一个类的成员,这个类本身可以迭代,但我不确定如何迭代。

有人能给我指正确的方向吗?

如何创建一个可以迭代的类集合

我希望这能为你澄清一些事情,因为我不完全确定我是否理解你的问题。

//many normal classes can be made xml serializable by adding [Serializable] at the top of the class
[Serializable]
private class ClassThing
{
    public string Name { get; set; }
    public int Foos { get; set; }
}
//here we create the objects so you can access them later individually
ClassThing thing1 = new ClassThing { Name = "name1", Foos = 1 };
ClassThing thing2 = new ClassThing { Name = "name2", Foos = 2 };
ClassThing thing3 = new ClassThing { Name = "name3", Foos = 3 };
//this is an example of putting them in a list so you can iterate through them later.
List<ClassThing> listOfThings = new List<ClassThing>();
listOfThings.Add(thing1);
listOfThings.Add(thing2);
listOfThings.Add(thing3);
//iteration example
string combined = string.Empty;
foreach (ClassThing thing in listOfThings)
{
    combined += thing.Name;
}
//you could also have created them directly in the list, if you didnt need to have a reference for them individually, like this:
listOfThings.Add(new ClassThing { Name = "name4", Foos = 4 });
//and more advanced concepts like linq can also help you aggregate your list to make the combined string. the foreach makes the code more readable though. this gives the same result as the foreach above, ignore it if it confuses you :)
string combined = listOfThings.Aggregate(string.Empty, (current, thing) => current + thing.Name);
//Here is an example of how you could serialize the list of ClassThing objects into a file:
using (FileStream fileStream = new FileStream("classthings.xml", FileMode.Create))
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<ClassThing>));
    xmlSerializer.Serialize(fileStream, listOfThings);
}

为了能够使用此方法序列化对象,它们不能包含构造函数,这就是为什么我们使用new ClassThing{Name="",Foos=0}方法来创建它们。

您正在寻找IEnumerable接口的实现。有关如何实现它的快速描述,请参阅此链接。

    class MyClass
{
    private ClassThing Thing1;
    private ClassThing Thing2;
    private ClassThing Thing3;
    internal IEnumerable<ClassThing> GetThings()
    {
            yield return Thing1;
            yield return Thing2;
            yield return Thing3;
    }
    void Test()
    {
        foreach(var thing in this.GetThings())
        {
            //use thing
        }
    }
}
public List<ClassThing> Things = new List<ClassThing>();

然后你可以运行你的foreach