2012-09-09 62 views
3

我對C#比較陌生。在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. 
*/ 
+0

我不認爲馬克斯在您的示例中使用()將自動確定哪個子成員具有最高的「年齡」屬性。此外,您的Compare實現似乎將Pet.Name字符串的長度添加到比較之前的年齡(例如,Pet {Name ='Bob',Age = 4}等於Pet {Name ='NotBob',Age =' 1'}。也許可以修復這個方法來分別評估屬性嗎? – Nicodemeus

+0

代碼只是我認爲很接近的一個例子。List name = new List(); List age = new List();是我的名字和年齡是的,我需要從最大年齡的名字中得到兩個名單...對不起,我感到困惑 –

回答

1

另一種解決方案可以與被修改CompareTo()方法

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

編輯1:

但是,如何從兩個列表中獲取姓名和年齡? List name = new List();列表年齡=新列表();是我有信息的地方。

如果我明白你需要從兩個列表中創建另一個寵物列表。所以,你必須 把它添加到Pet類:

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

然後執行它來創建寵物從兩個列表名單:

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

記住兩個列表必須具有相同的長度否則這段代碼將會拋出一個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()); 
+0

謝謝。我如何從兩個列表中獲取名稱和年齡? e = new List();列表年齡=新列表();是我有信息的地方。該代碼是一個已經有方法名稱和年齡的示例...? –

+0

好的,我編輯了我的答案。 –

+0

感謝您的幫助Fuex。然而,當我把它放在一起時,我得到了「Pet.Pet」的輸出。我怎樣才能粘貼代碼來顯示?我只有500個字符... –

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

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

你也可以使用morelinq's MaxBy

var name = pets.MaxBy(p=>p.Age).Name; 
0

我很困惑。你問「我如何得到相應的名字?」和你的代碼返回正確的答案。然後你問「有沒有辦法從列表中創建新對象?」答案是肯定的,但是你究竟想通過這樣做來實現?

如果您想查找最老的寵物,則您的CompareTo方法不正確。 它應該是這樣的:

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

然後:

public int IComparable<Pet>.CompareTo(Pet other) 
{ 
    return this.Age - other.Age; 
} 
+0

對不起,混淆是的,比較方法得到適當的年齡。但我的問題是獲取名稱和年齡比較也就是說,它們並沒有在MaxEx3()方法中定義,如下例所示:我的名字和年齡定義在兩個列表中:List name = new List(); List age = new List();我怎樣才能得到它們到一個方法來比較?這是否有道理? –

0

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

然後你可以用最大根據自己的比較函數以獲得最大的:可以使用Zip循環兩份名單

var maxPet = pers.Max(); 
+0

我喜歡這個。 – 2013-10-10 09:57:15

相關問題