使用数组或IEnumerable作为详细信息类

时间:2011-06-13 16:44:01

标签: c#

我有这堂课:

public class TextFiller
{
    public HtmlText Text { get; set; }
    public string Details { get; set; }
}

我需要创建一个由许多TextFillers组成的父类。我想知道最好的方法。是否最好使用我在a线,b线上的内容来做到这一点,还是有更好的解决方案?

public class TextFillerParent
{
  public TextFiller[] TextFiller { get; set; }    <<< a
  public IEnumerable<TextFiller> TextFiller { get; set; }  <<< b
}

我将要做的是将数据存储在Azure中,因此我希望能够将TextFillerParent序列化为JSON字符串。如果TextFillerParent的内容是TextFiller的数组或者我使用IEnumberable会有什么区别吗?使用IEnumerable有优势吗?

我必须能够设置单个TextFiller的值。我知道我可以使用数组执行此操作但是如果我使用IEnumerable或者IEnumerable仅适用于顺序访问,我是否也可以这样做?

谢谢。

4 个答案:

答案 0 :(得分:3)

如果您需要访问单个项目,您可能希望使用IList的泛型版本。我会在阵列上推荐它。

此外,使用LINQ,您可以获得的不仅仅是来自IEnumerable对象的顺序访问。

答案 1 :(得分:0)

我会使用你在b上说的IEnumerable版本。它允许使用泛型进行更多控制,也适用于序列化。

答案 2 :(得分:0)

泛型:public IEnumerable<TextFiller> TextFiller { get; set; }

为您提供更友好/更安全的界面,用于添加,删除,搜索等。只要您的属性(文本,详细信息)保持公开,那么它们就可以序列化。

您可以通过以下任一方式访问列表中的单个TextFiller:

var thisItem = MyList[2];

var thisItem = MyList.Find(AddressOf anotherObject);

这是另一篇文章,其中介绍了Generics over Arrays的一些优点。

Generics vs. Array Lists


    var Parent = new TextFillerParent();
    Parent.TextFillers.Add(new TextFiller { ..});
    Parent.TextFillers.Add(new TextFiller { ..});

    if(Parent.TextFillers[1] != null)
    {
        var child = Parent.TextFillers[1];
    }

答案 3 :(得分:0)

我会将它声明为IEnumerable,如果你不需要能够索引它。如果这样做,请尝试使用IList(继承自通用IEnumerable)。

原因正如威尔所说的那样;数组必须始终是一个数组。您可以通过它进行索引和枚举,但不能在不滚动自己的extendo-Array代码的情况下添加,删除等。

相比之下,使用IEnumerable可以使用任何实现该接口的东西,这大大拓宽了候选字段;所有你关心的是,无论实际的可枚举类型能做什么,都可以枚举所引用的内容。