2011-06-13 29 views
0

我有这个类:使用数组或IEnumerable的一个细节类

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只适用于顺序访问,我也可以这么做吗?

谢谢。

+1

数组必须始终为arry,而IEnumerable可以是数组,List,Collection或实现IEnumerable的任何其他类型......哪个更易于使用? – Will 2011-06-13 16:47:25

+0

但是,如果我想要使用数组,那么我不必像在行(a)中那样在TextFillerParent中定义它。你提到的IEnumerable可以是一个数组。我怎样才能将IEnumerable设置为一个数组,并真的有所作为?谢谢 – Emily 2011-06-13 16:53:52

+0

它在可用性方面略有不同。在评论中有一点需要解释。但想想这样..如果我使用你的班级,我有一个名单,你需要一个TextFiller []然后我必须将列表转换为一个数组。如果你使用任何枚举,我可以传入一个List,一个数组或任何其他实现了IEnumerable 的类型。 – Will 2011-06-13 18:46:22

回答

3

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

此外,使用LINQ,您可以从IEnumerable对象中获得比顺序访问更多的功能。

+1

为什么IList的通用版本(不确定是什么)比数组好? – Emily 2011-06-13 16:52:25

+0

因为IList 可以是实现IList的任何东西,它允许索引,元素添加和删除等等。一个数组对于必须限制集合长度的情况非常适用,但是当你不需要时,它是不必要的阻碍。 – KeithS 2011-06-13 16:55:14

+1

@Emily - IList比数组更好,因为它可以给你类似的功能,但是对你使用的实际类型的约束更少。数组是具体的实现。最好尽可能使用接口,以便您的代码不受任何特定实现的约束。 – 2011-06-13 16:59:46

0

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

+0

是的,但另一个人在这里说只有在我不需要索引它时才使用IEnumerable,这是一个需求。 – Emily 2011-06-13 17:05:48

0

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

给你一个友好/多种类型的安全接口,用于添加,删除,搜索,等等。只要你的属性(文本,细节)保持公开,那么它们将是可序列化的。

你可以做任何列表访问单个TextFiller:

var thisItem = MyList[2]; 

var thisItem = MyList.Find(AddressOf anotherObject); 

这里的另一个帖子里面占地阵列泛型的一些好处。

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]; 
    } 
+0

如果您有一分钟可以向我展示如何创建TextFillerParent,然后向其中添加两个TextFiller对象。然后我如何访问第二个TextFiller对象。 – Emily 2011-06-13 16:56:46

+0

我将代码添加到上面我的答案的底部:) – christofr 2011-06-13 17:05:23

+0

对不起,但我在这里感到困惑,因为另一个人说“如果你不需要索引它,就会声明它为IEnumerable。 ,请尝试使用IList“你是说不使用IList? – Emily 2011-06-13 17:08:27

0

我将宣布它作为一个IEnumerable,如果你并不需要能够索引它。如果是这样,请尝试使用IList(从通用IEnumerable继承)。

之所以完全如Will所说;数组必须始终是一个数组。您可以通过它进行索引和枚举,但是无法添加,删除等,而无需滚动您自己的extendo-Array代码。

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

+0

什么是我使用ILIST的语法。这是非常重要的,我可以索引它。我也想能够添加到集合中。 – Emily 2011-06-13 16:58:25

+0

如果它是一个ILIST我可以序列化它像一个数组? – Emily 2011-06-13 16:59:35

相关问题