像c#中的Lists一样用括号初始化元素
Initialize elements with brackets like Lists in c#
我在考虑数组和列表,想知道 classes 是否以及如何使实现像它们一样可初始化。以这个class为基础:
class TestClass
{
private List<int> Numbers = new List<int> ();
// Insert code here
}
我希望能够做的是采用给定的值并在内部填充我的列表。
TestClass test = new TestClass () { 2, 4, 7, 10 };
通常可能是这样的:
List<int> test = new List<int> () { 2, 4, 7, 10 };
但我想将它用于我自己的自定义 classes。下一个可选的问题是,是否可以对这种语法进行同样的操作:
TestClass test = { 2, 4, 7, 10 };
我认为这不太可能发生。注意,这些与此不同:
Cat cat = new Cat() { Name = "Sylvester", Age=8 };
这些是内部字段和属性的直接和可选声明。
您只需要一个 Add
方法来完成这项工作并实现 IEnumerable
接口:
class TestClass : IEnumerable<int>
{
private List<int> Numbers = new List<int> ();
public void Add(int n)
{
Numbers.Add(n);
}
public IEnumerator<int> GetEnumerator()
{
return Numbers.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
编译器将识别集合初始化器语法并尝试找到匹配的 Add
方法。
如 here 所述,集合初始化程序将在任何实现 IEnumerable
和 具有 Add()
方法的 class 上工作.
class TestClass : IEnumerable<int>
{
private List<int> Numbers = new List<int> ();
public void Add(int n)
{
Numbers.Add(n);
}
// implement IEnumerable methods down here ...
public IEnumerator<int> GetEnumerator() => Numbers.GetEnumerator();
// etc ...
}
请注意,如果您的 Add()
方法签名中有多个参数,则可以将它们括在花括号中以使用集合初始化语法。
class TestClass2 : IEnumerable<(int, int)>
{
private List<int> Numbers = new List<(int, int)> ();
public void Add(int x, int y)
{
Numbers.Add((x, y));
}
// implement IEnumerable methods down here ...
public IEnumerator<(int, int)> GetEnumerator() => Numbers.GetEnumerator();
// etc ...
}
会这样使用:
var test = new TestClass2 { {2, 3}, {4, 5} };
从技术上讲,最低 要求是
IEnumerable
接口(当然,IEnumerable<T>
是更好的选择)
Add
方法
最小示例(仅演示):
class TestClass: System.Collections.IEnumerable {
public void Add(int value) { }
public IEnumerator GetEnumerator() {
// Just to demonstrate, do not do this in production code
return null;
}
}
...
TestClass myTest = new TestClass() {1, 2, 3};
你的情况:
class TestClass: IEnumerable<int> {
private List<int> Numbers = new List<int>();
// This is required
public void Add(int value) {
Numbers.Add(value);
}
public IEnumerator<int> GetEnumerator() {
return Numbers.GetEnumerator();
}
// This is required
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}
回答你的第二个子问题:如果可以的话
TestClass test = { 2, 4, 5, 7 };
我认为这在任何地方都不正确。但是,您可以使用隐式运算符创建看起来像它的东西。
由于您可以像这样实例化一个 int array
:new[] {1,2,3,4}
,您可以在 TestClass
.
中创建以下内容
public class TestClass {
private IEnumerable<int> list;
public TestClass(IEnumerable<int> _list) {
this.list = _list;
}
public static implicit operator(int[] input) {
return new TestClass(input.ToList());
}
}
然后像这样创建一个新的TestClass;
TestClass testClass = new[] {1,2,3};
我在考虑数组和列表,想知道 classes 是否以及如何使实现像它们一样可初始化。以这个class为基础:
class TestClass
{
private List<int> Numbers = new List<int> ();
// Insert code here
}
我希望能够做的是采用给定的值并在内部填充我的列表。
TestClass test = new TestClass () { 2, 4, 7, 10 };
通常可能是这样的:
List<int> test = new List<int> () { 2, 4, 7, 10 };
但我想将它用于我自己的自定义 classes。下一个可选的问题是,是否可以对这种语法进行同样的操作:
TestClass test = { 2, 4, 7, 10 };
我认为这不太可能发生。注意,这些与此不同:
Cat cat = new Cat() { Name = "Sylvester", Age=8 };
这些是内部字段和属性的直接和可选声明。
您只需要一个 Add
方法来完成这项工作并实现 IEnumerable
接口:
class TestClass : IEnumerable<int>
{
private List<int> Numbers = new List<int> ();
public void Add(int n)
{
Numbers.Add(n);
}
public IEnumerator<int> GetEnumerator()
{
return Numbers.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
编译器将识别集合初始化器语法并尝试找到匹配的 Add
方法。
如 here 所述,集合初始化程序将在任何实现 IEnumerable
和 具有 Add()
方法的 class 上工作.
class TestClass : IEnumerable<int>
{
private List<int> Numbers = new List<int> ();
public void Add(int n)
{
Numbers.Add(n);
}
// implement IEnumerable methods down here ...
public IEnumerator<int> GetEnumerator() => Numbers.GetEnumerator();
// etc ...
}
请注意,如果您的 Add()
方法签名中有多个参数,则可以将它们括在花括号中以使用集合初始化语法。
class TestClass2 : IEnumerable<(int, int)>
{
private List<int> Numbers = new List<(int, int)> ();
public void Add(int x, int y)
{
Numbers.Add((x, y));
}
// implement IEnumerable methods down here ...
public IEnumerator<(int, int)> GetEnumerator() => Numbers.GetEnumerator();
// etc ...
}
会这样使用:
var test = new TestClass2 { {2, 3}, {4, 5} };
从技术上讲,最低 要求是
IEnumerable
接口(当然,IEnumerable<T>
是更好的选择)Add
方法
最小示例(仅演示):
class TestClass: System.Collections.IEnumerable {
public void Add(int value) { }
public IEnumerator GetEnumerator() {
// Just to demonstrate, do not do this in production code
return null;
}
}
...
TestClass myTest = new TestClass() {1, 2, 3};
你的情况:
class TestClass: IEnumerable<int> {
private List<int> Numbers = new List<int>();
// This is required
public void Add(int value) {
Numbers.Add(value);
}
public IEnumerator<int> GetEnumerator() {
return Numbers.GetEnumerator();
}
// This is required
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}
回答你的第二个子问题:如果可以的话
TestClass test = { 2, 4, 5, 7 };
我认为这在任何地方都不正确。但是,您可以使用隐式运算符创建看起来像它的东西。
由于您可以像这样实例化一个 int array
:new[] {1,2,3,4}
,您可以在 TestClass
.
public class TestClass {
private IEnumerable<int> list;
public TestClass(IEnumerable<int> _list) {
this.list = _list;
}
public static implicit operator(int[] input) {
return new TestClass(input.ToList());
}
}
然后像这样创建一个新的TestClass;
TestClass testClass = new[] {1,2,3};