我有这堂课:
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仅适用于顺序访问,我是否也可以这样做?
谢谢。
答案 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的一些优点。
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可以使用任何实现该接口的东西,这大大拓宽了候选字段;所有你关心的是,无论实际的可枚举类型能做什么,都可以枚举所引用的内容。