Доступ к элементу коллекции с помощью ключа

#c# #collections

#c# #Коллекции

Вопрос:

Я объявил список для динамического создания объекта моего класса.

 List<clsFormula> oFormula = new List<clsFormula>();
for (int i = 0; i < 4; i  )
{
  oFormula.Add(new clsFormula());
}
  

Когда я захочу использовать функцию из объекта номер 2, я напишу свой код следующим образом

 oFormula[2].FunctioName(); 
  

Мой вопрос: могу ли я определить имя непосредственно в объекте вместо использования number? итак, это было бы похоже oFormula["StringName"].FunctionName() ; какой код я должен использовать при объявлении объекта среды выполнения?

Комментарии:

1. вы можете попробовать использовать Dictionary<string,clsFormula> вместо использования list<clsFormula>

2. Это выполнимо ~! ‘Dictionary<строка, clsFormula> of = новый словарь<строка, clsFormula>(); of.Add(«Плюс», новая clsFormula()); MessageBox. Показать(из[«Плюс»]. Управлять(» «, 1, 2). toString());’

3. Да, однако вам необходимо знать имя элемента в момент вставки его в словарь. KeyedCollection инкапсулирует это в саму коллекцию.

Ответ №1:

Создайте новый тип коллекции и унаследуйте его от System.Коллекции.Объектная модель.KeyedCollection. Переопределите метод GetKeyForItem и верните имя объекта clsFormula.

http://msdn.microsoft.com/en-us/library/ms132438.aspx

 public class clsFormulaCollection : KeyedCollection<string, clsFormula>
{
    protected override string GetKeyForItem(clsFormula item)
    {
        return item.Name;
    }
}

clsFormulaCollection oFormula = new clsFormulaCollection();

for (int i = 0; i < 4; i  )
{
    oFormula.Add(new clsFormula());
}

oFormula["FormulaName"].SomeFunction();
  

Комментарии:

1. я использую Framework3.5. я думаю, что KeyCollection работает только для framework4.0.

2. KeyedCollection доступен с .NET 2.0

Ответ №2:

В списке нет индексатора, который использует строковый параметр. Вы можете наследовать от List<T> и создать индексатор, который принимает строку, и вам нужно реализовать логику для поиска и возврата элемента.

 public class SampleList<T> : List<T>
{
public T this(string name)
{
get
{
//Find the Item and return.
}
}
}
  

Ответ №3:

Поймите, что это не java, но когда я достиг предела удаления, оставив его открытым.


Если это java.

List хранит данные и сопоставляет их с индексом. для вашего требования вам необходимо использовать java.util.Map

 Map<String, clsForumla> map = new Map<String, clsForumla>();
map.put("firstObj",new clsForumla());
map.put("secondObj",new clsForumla());
map.put("thirdObj",new clsForumla());


//calling method on second object

map.get("secondObj").foo();
  

Комментарии:

1. Это не Java, потому что он вызвал «Добавить». Начинать имена методов с заглавной буквы — это скорее привычка Microsoft.

Ответ №4:

этот код отлично работает для меня,

я создал образец приложения для вашего решения,

у меня есть класс, как показано ниже,

 public class ClsFormula
{
    public ClsFormula()
    {

    }

    public int Function1()
    {
        return 5   6;
    }
}
  

теперь я использую этот класс для одного из событий click, создавая список объектов класса,

 List<ClsFormula> clsformula = new List<ClsFormula>();

        for (int i = 0; i < 4; i = i   1)
        {
            ClsFormula objcls = new ClsFormula();
            clsformula.Add(objcls);
        }

        MessageBox.Show(clsformula[2].Function1().ToString());
  

у меня это работает нормально.