2016-08-13 3 views
0

Я много искал, но не могу найти ответ, который я достаточно понимаю, чтобы перевести в мой проект. Какова цель: мне нужно найти элемент с самым высоким параметром armor_class в списке и добавить класс брони armor_class в класс брони персонажа.C# - Как получить элемент из общего списка с самым высоким конкретным параметром?

Итак, у нас есть список создан таким образом:

public List<Weapon> characterInvWeapon; 
public List<Armor> characterInvArmor; 

т.д.

Вот как создаются класс брони и ее свойства:

public class Armor : Item, IComparable <Armor> { 
    public string armor_prof; 
    public string armor_category; 
    public int armor_class; 
    public int armor_str_req; 
    public string armor_stealth_mod; 

    public Armor (string c_name 
     , string c_description 
     , bool c_stackable 
     , int c_value 
     , string c_coin_type 
     , int c_weight 
     , string c_armor_prof 
     , string c_armor_category 
     , int c_armor_class 
     , int c_armor_str_req 
     , string c_armor_stealth_mod) : base (c_name, c_description, c_stackable, c_value, c_coin_type, c_weight) 
    { 
     armor_prof = c_armor_prof; 
     armor_category = c_armor_category; 
     armor_class = c_armor_class; 
     armor_str_req = c_armor_str_req; 
     armor_stealth_mod = c_armor_stealth_mod; 
    } 

    public int CompareTo(Armor other) 
    { 
     if (armor_class == other.armor_class) 
     return String.Compare (name, other.name); // a < ab < b 
     else 
     return other.armor_class - armor_class; 
    } 
} 

Броня класс наследующий class Item, который имеет первые 6 свойств. Брони хранятся в списке, предназначенном для брони - public List<Armor> characterInvArmor;.

Пример пункт:

AddToItemStore(new Armor("Breastplate", "Description.", false, 400, "gp", 20, "Breastplate", "Medium Armor", 14, 0, "")); 

Добавление сценария:

public void AddToCharacterInventory(Item it) 
    { 
     if (it is Weapon) 
     { 
      charInvWeapon.Add((Weapon)it); 
      charInvWeapon.Sort(); 
     } 
     else if (it is Armor) 
     { 
      charInvArmor.Add((Armor)it); 
      charInvArmor.Sort(); 
     } 
    } 

Теперь, как я уже говорил, мне нужно найти пункт в списке charInvArmor с самым высоким параметром armor_class и использовать его значение в другой функции , который вычисляет класс брони из многих переменных.

Таким образом, в другой функции, characterArmorClass = armorWithHighestArmorClass + otherVariable + someotherVariable; и т.д.

Я подозреваю, что есть некоторые удобные ярлыки в Linq, но я был бы самым благодарным за некоторые примеры без Linq. Linq тоже приветствуется, но я абсолютно новичок в этом, а также беспокоюсь о производительности и совместимости приложений с iPhone. Я читал, что iOS может вызвать проблемы с Linq. Это должен быть быстрый и совместимый расчет.

ответ

1

Вы должны перебрать список и проверьте каждое значение, так как список не сортируется на основе значения класса брони, и вы не хотите использовать LINQ:

int maxArmorClass = 0; 
foreach (var armor in characterInvArmor) 
{ 
    // Do a comparison here and see if you found a higher value 
    // If a higher value is found, store it in maxArmorClass 
} 

В качестве примечания я рекомендую следующие ссылки:

Public Fields versus Automatic Properties

и

Style guide for c# * В C#, Pascal обсадных и верблюд ЦПИМП g - это установленные конвенции.

+0

Да, это был бы, вероятно, лучший способ. Но как мне сравнивать предметы, если они все «брони» в этом случае? пс. Я прочитаю его, спасибо, я действительно новичок в C# и кодировании, поэтому я делаю много ошибок на этом этапе. –

+0

@Sarr: Вы не можете просто выполнить 'if (armor.armor_class> maxArmorClass)'? Я не уверен, что вы подразумеваете под «если все они« доспехи ». –

+0

О, черт побери, извините, не думал о очевидной вещи. Выезд. // И это все, абсолютно блестящее и простое решение для меня. Спасибо, это поможет во многих других областях. –

2

С LINQ:

int maxArmorClass = characterInvArmor.Max(armor => armor.armor_class); 

Без LINQ с Сортировка:

var list = characterInvArmor.ToList(); // copy list, so we do not break sorted orded 
list.Sort((armor1, armor2) => armor2.armor_class.CompareTo(armor1.armor_class)); 
int maxArmorClass = list[0].armor_class; 

И, конечно, вы всегда можете написать ручной метод с циклом и "макс" переменной.

BTW, я заметил, что вы сортируете charInvArmor в AddToCharacterInventory метод. Если массив всегда отсортирован, то на основе вашей реализации CompareTo элемент с максимальным armor_class всегда должен быть последним (или, во-первых, я не уверен). Поэтому просто возьмите последний (первый) элемент вашего списка.

+0

Спасибо, кажется, лучше, чем я придумал. И да, это отсортировано здесь, но иногда я добавляю элементы, не сортируя их, и было любопытно, есть ли другой способ. И да, может быть, мне не нужен список, отсортированный таким образом позже - я думал, что сортировка его каждый раз и сортировка по другому параметру будет дорогостоящей с производительностью и просто слишком большой операцией для такой «простой» задачи. Итак, ваше решение с копированием списка уже является лучшей идеей. –

 Смежные вопросы

  • Нет связанных вопросов^_^