Создание инициализатора коллекции словаря в пользовательском классе
Возможный дубликат:
Инициализаторы пользовательской коллекции
У меня есть простой класс Pair:
public class Pair<T1, T2>
{
public Pair(T1 value1, T2 value2)
{
Value1 = value1;
Value2 = value2;
}
public T1 Value1 { get; set; }
public T2 Value2 { get; set; }
}
И хотел бы иметь возможность определять его как объект Dictionary, все inline, например:
var temp = new Pair<int, string>[]
{
{0, "bob"},
{1, "phil"},
{0, "nick"}
};
Но он просит меня определить полную новую пару (0, "bob" ) и т.д., как бы это реализовать?
Как обычно, спасибо, ребята!
Ответы
Ответ 1
Чтобы заставить пользовательскую инициализацию работать как словарь, вам нужно поддерживать две вещи. Ваш тип должен реализовывать IEnumerable
и иметь соответствующий метод Add
. Вы инициализируете Array
, который не имеет метода Add
. Например
class PairList<T1, T2> : IEnumerable
{
private List<Pair<T1, T2>> _list = new List<Pair<T1, T2>>();
public void Add(T1 arg1, T2 arg2)
{
_list.Add(new Pair<T1, T2>(arg1, arg2));
}
IEnumerator IEnumerable.GetEnumerator()
{
return _list.GetEnumerator();
}
}
а затем вы можете сделать
var temp = new PairList<int, string>
{
{0, "bob"},
{1, "phil"},
{0, "nick"}
};
Ответ 2
Почему бы не использовать класс, который наследуется от Dictionary
?
public class PairDictionary : Dictionary<int, string>
{
}
private static void Main(string[] args)
{
var temp = new PairDictionary
{
{0, "bob"},
{1, "phil"},
{2, "nick"}
};
Console.ReadKey();
}
Вы также можете создать свою собственную коллекцию (я подозреваю, что это так, потому что у вас есть тот же Value1
для двух элементов, поэтому T1
не действует как ключ в вашем примере), которые не наследуются от Dictionary
.
Если вы хотите использовать синтаксический сахар инициализатора коллекции, вам нужно будет предоставить метод Add
, который принимает 2 аргумента (T1
и T2
, которые являются int
и string
в вашем случае).
public void Add(int value1, string value2)
{
}
См. Инициализаторы пользовательской коллекции
Ответ 3
public class Paircollection<T1, T2> : List<Pair<T1, T2>>
{
public void Add(T1 value1, T2 value2)
{
Add(new Pair<T1, T2>(value1, value2));
}
}
а затем
var temp = new Paircollection<int, string>
{
{0, "bob"},
{1, "phil"},
{0, "nick"}
};
будет работать. По сути, вы просто создаете версию List<Pair<T1,T2>>
, которая знает, как делать правильные добавления.
Это, очевидно, расширяемо для любого другого класса, чем Pair (таким образом, что словарные решения не являются).
Благодаря Юрию Факторочу за то, что он помог мне с моим первоначальным пониманием и связанным вопросом, указав мне в правильном направлении.
Ответ 4
Синтаксис, который вы ищете, не предоставляется объектом, который используется со словарем, это сама коллекция словарей. Если вам нужно использовать инициализатор коллекции, вам нужно будет использовать существующую коллекцию (например, словарь) или реализовать пользовательскую коллекцию для ее размещения.
В противном случае вы в основном ограничены:
var temp = new Pair<int, string>[]
{
new Pair(0, "bob"),
new Pair(1, "phil"),
new Pair(0, "nick")
};