带有字符串键和不同类型值的C#集合或数组

时间:2016-02-01 12:13:23

标签: c# .net arrays dictionary collections

我需要在多个字段中存储有关一篇文章的数据,在此示例中包含3个字段:

article["title"]       = "Article Title";        // string
article["description"] = "Article Description";  // string
article["total_pages"] = 15;                     // int

然后我需要能够使用存储的数据:

int pages = article["total_pages"]; // cast not required

MessageBox.Show(pages.ToString());    
MessageBox.Show(article["title"]);

问题:

这样存储数据的正确方法是什么?

我可以简单地创建string article_titlestring article_descriptionint article_total_pages等变量,但如果文章实际上有超过10个字段,则代码会变得非常混乱。

修改

如果可以在一个地方的某个地方定义所有字段,那就没问题。我需要的是在程序中使用这些数据时能够获得干净的代码。

E.g。 Article["Title"]Article.Title(非常干净的用法)

4 个答案:

答案 0 :(得分:2)

为该案例创建一个类

class Article
{
    public string Title {get;set;}
    public string Description { get; set; }
    public int Pages { get; set; }
}

答案 1 :(得分:1)

您可以使用object作为类型的字典。然后将其包裹起来以避免投射它,我们在获取它时使用泛型:

class ObjectStore
{
    private readonly Dictionary<string, object> _objects = new Dictionary<string, object>();

    public void Add(string key, object obj)
    {
        _objects[key] = obj;
    }

    public object Get<T>(string key)
    {
        object obj;
        if(_objects.TryGetValue(key, out obj))
        {
            return (T)obj;
        }

        return default(T);
    }

    public object this[string key]
    {
        get { return _objects[key]; }
        set { _objects[key] = value; }
    }
}

用法:

ObjectStore os = new ObjectStore();
os["int"] = 4;
os.Add["string"] = "hello";

// With generic method (no cast)
int num = os.Get<int>("int");
string str = os.Get<string>("string");

// Or...
int num = (int)os["int"];
string str = (string)os["string"];

答案 2 :(得分:1)

您可以尝试使用字符串键和动态值的字典:

var article = new Dictionary<string, dynamic>();

article["title"] = "Article Title";
article["description"] = "Article Description";
article["total_pages"] = 15;

int pages = article["total_pages"];
string title = article["title"];

您还可以使用ExpandoObject实现类似的效果:

dynamic article = new ExpandoObject();
article.Title = "Article Title";
article.Description = "Article Description";
article.TotalPages = 15;

int pages = article.TotalPages;
string title = article.Title;

答案 3 :(得分:0)

理想情况下,您将类似信息存储在类中,将其逻辑分组以表示对象。例如,Article类。

public class Article
{
    public string Title { get;set; }
    public int TotalPages { get; set; }
    public string Description { get; set; }
}

然后,您可以根据需要设置IList<Article>IDictionary<Article>。无论哪种方式,您都可以使用LINQ过滤或选择符合所需条件的文章。