3

私はC#に比較的慣れていません。

名前と年齢のリストから最大年齢の名前を見つけようとしています。以下の例とは異なり、どの名前や年齢が事前に付けられているのかわかりません。

名前と年齢は、以下の2つのリストから作成されます。

List<string> name = new List<string>();
List<double> age = new List<double>();

Max()メソッドで最大年齢を見つける方法を知っていますが、対応する名前を取得するにはどうすればよいですか?以下の例では、リストから新しいオブジェクトを作成する方法はありますか?

/// This class implements IComparable to be able to  
/// compare one Pet to another Pet. 
/// </summary> 
class Pet : IComparable<Pet>
{
    public string Name { get; set; }
    public int Age { get; set; }

    /// <summary> 
    /// Compares this Pet to another Pet by  
    /// summing each Pet's age and name length. 
    /// </summary> 
    /// <param name="other">The Pet to compare this Pet to.</param>
    /// <returns>-1 if this Pet is 'less' than the other Pet,  
    /// 0 if they are equal, 
    /// or 1 if this Pet is 'greater' than the other Pet.</returns> 
    int IComparable<Pet>.CompareTo(Pet other)
    {
        int sumOther = other.Age + other.Name.Length;
        int sumThis = this.Age + this.Name.Length;

        if (sumOther > sumThis)
            return -1;
        else if (sumOther == sumThis)
            return 0;
        else 
            return 1;
    }
}

public static void MaxEx3()
{
    Pet[] pets = { new Pet { Name="Barley", Age=8 },
                   new Pet { Name="Boots", Age=4 },
                   new Pet { Name="Whiskers", Age=1 } };

    Pet max = pets.Max();

    Console.WriteLine(
        "The 'maximum' animal is {0}.",
        max.Name);
}

/*
 This code produces the following output:

 The 'maximum' animal is Barley.
*/
4

4 に答える 4

2
var pet = pets.OrderByDescending(p => p.Age).First();    

var name = pets.OrderByDescending(p => p.Age).First().Name;

morelinqのMaxByを使用することもできます

var name = pets.MaxBy(p=>p.Age).Name;
于 2012-09-09T20:32:09.117 に答える
1

別の解決策は、次のようにCompareTo()メソッドを変更することです。

int IComparable<Pet>.CompareTo(Pet pet)
{
    return this.Age.CompareTo( pet.Age );
}

それで:

var olderPet = pets.Max(); 
Console.WriteLine(olderPet.Name);   

編集1:

2つのリストから名前と年齢を取得するにはどうすればよいですか?リスト名=newList(); リスト年齢=新しいリスト(); 私が情報を持っているところです。

私が理解した場合は、与えられた2つのリストからペットの別のリストを作成する必要があります。したがって、これをPetクラスに追加する必要があります。

public Pet(string Name, int Age){
    this.Name = Name;
    this.Age = Age;
}

次に、これを実行して、2つのリストからペットのリストを作成します。

List<Pet> listPets = new List<Pet>();
for(int i = 0; i < listNames.Count; i++){
    listPets.Add(new Pet(name[i], age[i]));
}

2つのリストは同じ長さである必要があることに注意してください。そうでない場合、このコードは。をスローしArgumentOutOfRangeExceptionます。

編集2:

しかし、すべてをまとめると、「Pet.Pet」の出力が得られます。表示するコードを貼り付けるにはどうすればよいですか?

新しいリストのすべてのコンテンツを印刷する場合は、次のことができます。

foreach(Pet pet in listPets)
  Console.WriteLine("Name: " + pet.Name + "," + "Age: " + pet.Age.ToString());

または、これをペットクラスに追加できます。

public override string ToString(){
   return "Name: " + Name + "," + "Age: " + Age.ToString();
}

次に、このコードを使用して、リストのすべてのコンテンツを印刷します。

foreach(Pet pet in listPets)
  Console.WriteLine(pet.ToString());
于 2012-09-09T20:48:37.150 に答える
0

私は混乱しています。「対応する名前を取得するにはどうすればよいですか?」と尋ねます。そしてあなたのコードは正解を返します。次に、「リストから新しいオブジェクトを作成する方法はありますか?」と尋ねます。答えは「はい」ですが、それを実行して正確に何をアーカイブしたいですか?

最も古いペットを見つけたい場合は、CompareToメソッドが正しくありません。次のようになります。

public int IComparable<Pet>.CompareTo(Pet other)
{
    return this.Age - other.Age;
}
于 2012-09-09T20:42:09.957 に答える
0

Zipを使用して両方のリストを繰り返すことができます。

var pets = names.Zip(ages, (n, a) => new Pet { Name = n, Age = a });

次に、Maxを使用して、比較関数に従って最大値を取得できます。

var maxPet = pers.Max();
于 2012-09-10T11:55:45.443 に答える