我需要在多个字段中存储有关一篇文章的数据,在此示例中包含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_title
,string article_description
,int article_total_pages
等变量,但如果文章实际上有超过10个字段,则代码会变得非常混乱。
修改
如果可以在一个地方的某个地方定义所有字段,那就没问题。我需要的是在程序中使用这些数据时能够获得干净的代码。
E.g。 Article["Title"]
或Article.Title
(非常干净的用法)
答案 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过滤或选择符合所需条件的文章。