如何创建一个SortedList,将不同数据类型的列表存储为值?

时间:2016-01-28 17:05:43

标签: c# list data-structures unity3d

对于Unity游戏,我尝试解析文本文件并将游戏配置存储到键/值的SortedList中,其中键是要素的名称,值是存储在中的要素值他们各自的名单。

例如文本文件的片段:

Feature1 String Sphere Cube Cylinder
Feature2 Vector4 (0,0,0,255) (255,0,0,0)
Feature3 Int32 2
...

如何创建一个存储这些功能的SortedList,我可以通过索引轻松访问它们?

例如:

SortedList[0].Key would return Feature1
SortedList[0].Value would return a list that contains Sphere, Cube, Cylinder 

------我已编辑为附加我当前的代码以获得更好的背景------

我在提出问题之前的当前解决方案是创建一个SortedList,这样当我添加一个新条目时,值列表可以是任何数据类型。但是,当我开始使用和访问SortedList时,它需要做很多工作,因为我需要将列表内部转换为正确的集合类型。从长远来看,我不认为这是有效和恰当的。

使用排序列表有更好的方法吗?或者我应该使用不同的数据结构来实现它?

public static SortedList<String, IList> sortedList = new SortedList<String, IList>();
foreach (KeyValuePair<string, IList> data in sortedList) {
    if (data.Key == "Feature1") {
        listShapesSuperblock = new List<string> (data.Value.Cast<string>().ToList());
    }
    if (data.Key == "Feature2") {
        listColorsSuperblock = new List<Vector4> (data.Value.Cast<Vector4>().ToList()); 
    }
    if (data.Key == "Feature3") {
        listContextsSuperblock = new List<Vector4> (data.Value.Cast<Vector4>().ToList());
    }
}

2 个答案:

答案 0 :(得分:2)

我的建议是使用类结构来访问配置设置。如果使用json / xml格式,则可以将设置反序列化到类中,并以安全的方式在代码中访问它们。

设置类:

class Settings
{
    public List<string> shapes { get; set; }
    public List<Vector> vectors { get; set; }
}

文字档案:

{
    shapes: ["sphere", "cube"]
}

用法:

var settings = new JavaScriptSerializer().Deserialize<Settings>(readTextFile); 
string firstShape = settings.shapes.FirstOrDefault();

答案 1 :(得分:0)

如果不将列表转换为对象集合,则无法在C#中执行此操作。

基本上这听起来像是一个典型的内存缓存,它将值表示为一个对象,您必须自己将其转换回相应的类型。

如果每个值都是一个集合,那么您可以将其表示为IEnumerable<object>或仅object的排序列表:

var sortedList = new SortedList<string, IEnumerable<object>>(); var sortedList = new SortedList<string, object>();

我更喜欢后者,因为它更容易处理。