33

タプルのリストがあります:

List<Tuple<int, string, int>> people = new List<Tuple<int, string, int>>();

を使用してdataReader、このリストにさまざまな値を設定できます。

people.Add(new Tuple<int, string, int>(myReader.GetInt32(4), myReader.GetString(3), myReader.GetInt32(5)));

しかし、どうすればループスルーして、個々の値を取得できますか。たとえば、特定の人の 3 つの詳細を読みたいとします。ID、名前、電話番号があるとしましょう。次のようなものが欲しい:

        for (int i = 0; i < people.Count; i++)
        {
            Console.WriteLine(people.Item1[i]); //the int
            Console.WriteLine(people.Item2[i]); //the string
            Console.WriteLine(people.Item3[i]); //the int       
        }
4

7 に答える 7

33

peopleはリストなので、最初にリストにインデックスを付けてから、必要な項目を参照できます。

for (int i = 0; i < people.Count; i++)
{
    people[i].Item1;
    // Etc.
}

作業しているタイプを覚えておいてください。この種の間違いはほとんどありません。

people;          // Type: List<T> where T is Tuple<int, string, int>
people[i];       // Type: Tuple<int, string, int>
people[i].Item1; // Type: int
于 2013-07-23T15:45:23.273 に答える
14

間違ったオブジェクトにインデックスを付けています。 peopleはインデックスを作成する配列であり、 ではありませんItem1。 コレクションItem1内の任意のオブジェクトの値です。peopleしたがって、次のようにします。

for (int i = 0; i < people.Count; i++)
{
    Console.WriteLine(people[i].Item1); //the int
    Console.WriteLine(people[i].Item2); //the string
    Console.WriteLine(people[i].Item3); //the int       
}

余談ですが、 の代わりにこれらの値を保持する実際のオブジェクトを作成することを強くお勧めしますTuple。これにより、コードの残りの部分 (このループなど) がより明確になり、操作が簡単になります。それは次のような単純なものかもしれません:

class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int SomeOtherValue { get; set; }
}

次に、ループは大幅に単純化されます。

foreach (var person in people)
{
    Console.WriteLine(person.ID);
    Console.WriteLine(person.Name);
    Console.WriteLine(person.SomeOtherValue);
}

この時点で値の意味を説明するコメントは必要ありません。値自体が意味を示しています。

于 2013-07-23T15:47:50.440 に答える
3

探しているのはこれだけですか?

for (int i = 0; i < people.Count; i++)
{
    Console.WriteLine(people[i].Item1);
    Console.WriteLine(people[i].Item2);
    Console.WriteLine(people[i].Item3);       
}

またはを使用してforeach

foreach (var item in people) 
{
    Console.WriteLine(item.Item1);
    Console.WriteLine(item.Item2);
    Console.WriteLine(item.Item3);
}
于 2013-07-23T15:46:13.153 に答える
2

インデクサーの場所を変更する必要があります。次のように配置する必要があります。

for (int i = 0; i < people.Count; i++)
{
    Console.WriteLine(people[i].Item1); //the int
    Console.WriteLine(people[i].Item2); //the string
    Console.WriteLine(people[i].Item3); //the int       
}

ほら!

于 2013-07-23T15:49:28.620 に答える
1

これを試して:

for (int i = 0; i < people.Count; i++)
    {
        Console.WriteLine(people[i].Item1); //the int
        Console.WriteLine(people[i].Item2); //the string
        Console.WriteLine(people[i].Item3); //the int       
    }
于 2013-07-23T15:45:35.653 に答える
1

インデクサーを少し戻す必要があります。

for (int i = 0; i < people.Count; i++)
{
    Console.WriteLine(people[i].Item1); //the int
    Console.WriteLine(people[i].Item2); //the string
    Console.WriteLine(people[i].Item3); //the int       
}
于 2013-07-23T15:45:52.370 に答える