#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());
у меня это работает нормально.