0

有人知道如何将数组列表转换为字典列表吗?我有什么?我有一个包含很多字符串的 ArrayList (列表):

            foreach (string s in list)
            {
                Console.WriteLine(s);
            }

output:
klaus
male
spain
lissy
female
england
peter
male
usa
...

如我们所见,有一个命令。第一个条目是 NAME,第二个 GENDER,第三个 COUNTRY,然后是 NAME,GENDER... 等等。

现在为清楚起见,我想将这些属性存储在字典列表中。每个列表条目应该是具有这 3 个属性的 1 个字典。这是一个好主意吗?最简单的方法是什么?我只是搜索一些东西以将此列表存储在一个更好看的集合中,以后更容易处理。我有这个:

    List<Dictionary<string, string>> dlist = new List<Dictionary<string, string>>();
    const int separate = 3;

    foreach (string s in list)
    {
        //add list entries to dlist?
    }
4

8 回答 8

4
enum Gender
{
    Male = 0,
    Female = 1
}

class Person
{
    public string Name { get; set; }
    public Gender Gender { get; set; }
    public string Country { get; set; }

    public Person(string name, Gender gender, string country)
    {
        this.Name = name;
        this.Gender = gender;
        this.Country = country;
    }
}

用法:

List<Person> persons = new List<Person>();
Person person;
for (int i = 0; i < list.Count; i += 3) {
{
    person = new Person(list[i], (Gender)Enum.Parse(typeof(Gender), list[i+1], true), list[i+2]);
    persons.add(person);
}
于 2012-07-24T16:17:01.823 回答
4

不,这不是一个好主意。定义一个类。

至少是这样的:

class Person
{
    public string Name { get; set; }
    public string Gender { get; set; }
    public string Country { get; set; }
}

更好的办法是对 Gender 使用枚举,并可能为国家/地区使用一个类(内置或自定义)。

无论如何,要使用上述类填充集合,您可以使用以下内容:

List<Person> result = new List<Person>();

for (int i = 0; i < list.Count; i += 3) { 
    result.Add(
        new Person { Name = list[i], Gender = list[i+1], Country = list[i+2] }); 
} 

请注意,此循环缺少对列表中项目计数的错误检查,该计数应该是三的倍数。

于 2012-07-24T16:08:11.217 回答
0

这很简单。您正在为一个包含三个名为的数据变量的类工作:

字符串名称;字符串性别;字符串国家;

所以创建一个包含所有这三个变量的类。至于例如:

class Dictnary
{

public Dictnary(String nameFromCall, String genderFromCall, String countryFromCall)
{
this.name = nameFromCall;
this.gender = genderFromCall;
this.country = countryFromCall;
}
}
于 2012-07-24T17:02:27.837 回答
0

实现它的最简单方法 - 它创建一个新类来代表您列表中的某人,其中包含 3 个道具:

public class Someone {
    public string Name { get; set; }
    public string Gender { get; set; }
    public string Country { get; set; }
}

并且您可以使用某人条目填写您的目的地列表:

List<Someone> dList = new List<Someone>();
for(int i = 0; i < list.Count; i += 3)
    dList.Add(new Someone() { Name = list[i], Gender = list[i+1], Country = list[i+2] });

ps此代码可能包含错误,因为我无法访问安装了VS的计算机。

于 2012-07-24T16:15:29.953 回答
0

您可能有一个类来保存数据,例如:

public class Info
    {
        public string Name { get; set; }
        public string Gender { get; set; }
        public string Country { get; set; }
    }

那么你可以拥有这样的字典

Dictionary<int, Info> infoDict = new Dictionary<int, Info>();

然后你就可以开始阅读并准备字典了。

于 2012-07-24T16:15:51.930 回答
0
var listSrc = new List<string>
                    {
                        "klaus",
                        "male",
                        "spain",
                        "lissy",
                        "england",
                        "female",
                        "peter",
                        "usa",
                        "male",
                    };
var dlist = new List<Dictionary<string, string>>();

for (var i = 0; i < listSrc.Count; i++)
{
    var captions = new List<string>
                            {
                                "Name",
                                "Gender",
                                "Country"
                            };

    var list = listSrc.Take(3).ToList();
    listSrc.RemoveRange(0, 3);

    dlist.Add(list.ToDictionary(x => captions[list.IndexOf(x)], x => x));
}
于 2012-07-24T16:26:09.737 回答
0

要回答标题中的问题,这可能是最简洁的转换方式:

for (int i = 0; i < list.Count; i += 3) {
    dlist.Add(new Dictionary<string, string>() {
        { "name", (string)list[i] },
        { "gender", (string)list[i+1] },
        { "country", (string)list[i+2] }
    });
}

(如果你从 a 切换ArrayList到 a List<string>,你可以放弃(string)演员表。)

也就是说,除非您出于某种技术原因确实需要字典,否则最好使用其他答案中建议的基于类的方法之一来解决您的问题。

于 2012-07-24T16:06:56.833 回答
0

我建议使用一个类来封装您的条目:

class Entry
{
    public String Name { get; set; }
    public String Gender { get; set; }
    public String Country { get; set; }
}

然后添加到Entrys列表中

List<Entry> elist = new List<Entry>();

for (int i = 0; i < list.Count; i += 3)
{
    var ent = new Entry() { Name    = list[i],
                            Gender  = list[i+1],
                            Country = list[i+2]};
    elist.Add(ent);
}

或者你可以使用元组:

List<Tuple<string, string, string>> tlist = 
    new List<Tuple<string, string, string>>();

for (int i = 0; i < list.Count; i += 3)
{
    Tuple<string,string, string> ent 
        = new Tuple<string,string,string>(list[i], list[i+1], list[i+2]);
    tlist.Add(ent);
}
于 2012-07-24T16:14:43.257 回答