0

誰かが配列リストを辞書のリストに変換する方法を知っていますか?私は何を持っていますか?たくさんの文字列を含むArrayList(リスト)があります:

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

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

ご覧のとおり、注文があります。最初のエントリはNAME、2番目のGENDER、3番目の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

いいえ、それは良い考えではありません。クラスを定義します。

少なくともこのようなもの:

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

さらに良いのは、性別の列挙型を使用し、場合によっては国のクラス(組み込みまたはカスタム)を使用することです。

とにかく、コレクションに上記のクラスを設定するには、次のようなものを使用します。

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] }); 
} 

このループには、リスト内のアイテム数のエラーチェックがないことに注意してください。これは3の倍数である必要があります。

于 2012-07-24T16:08:11.217 に答える
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 に答える
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] }
    });
}

ArrayList(からに切り替えると、キャストList<string>をドロップできます。)(string)

とはいえ、技術的な理由で本当に辞書が必要な場合を除いて、他の回答で提案されているクラスベースのアプローチの1つを使用すると、問題をより適切に解決できます。

于 2012-07-24T16:06:56.833 に答える
0

クラスを使用してエントリをカプセル化することをお勧めします。

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

次に、のリストに追加しEntryます

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 に答える
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

簡単だ。次の名前の3つのデータ変数を含むクラスで作業しています。

文字列名; 文字列の性別; 文字列の国;

したがって、これら3つの変数すべてを含むクラスを作成します。例として:

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 に答える