我该如何初始化一个自定义变量,例如这样:"Serie S = new Serie() { 1, 2, 3, 4 }"?

3

我创建了一个名为Serie的类,它基本上是一个列表。我该如何使其能够像List一样,通过这种方式创建一个序列:"Serie S = new Serie() { 1, 2, 3, 4 }"?

    class Serie
{
    public List<decimal> Serie_ { get; set; }

    public decimal this[int index]
    {
        get
        {
            return Serie_[index];
        }
        set
        {
            Serie_.Insert(index, value);
        }
    }

    public Serie()
    {

    }

    public Serie(List<decimal> serie)
    {
        Serie_ = serie;
    }

    public Serie Add(decimal Value)
    {
        List<decimal> lst = new List<decimal>();
        for (int i = 0; i < Serie_.Count; i++)
        {
            lst.Add(Serie_[i]);
        }
        lst.Add(Value);
        Serie S = new Serie(lst);
        return S;
    }

    public double Count()
    {
        return Serie_.Count;
    }

    public static Serie operator +(Serie left, decimal right)
    {
        List<decimal> temp = new List<decimal>();
        for (int i = 0; i < left.Count(); i++)
        {
            temp.Add(left[i] + right);
        }
        return new Serie(temp);
    }
}

尝试这样做时,我会收到错误信息:

无法使用集合初始化器初始化类型“” ,因为它未实现“System.Collections.IEnumerable”

但我不知道该怎么做。

5
错误消息只回答了这一点。实现IEnumerable接口。 - Andrei
3个回答

4

实现 IEnumerable<T>,尝试使用以下代码:

public class Serie : IEnumerable<decimal>
{
    List<decimal> mylist = new List<decimal>();

    public decimal this[int index]
    {
        get { return mylist[index]; }
        set { mylist.Insert(index, value); }
    }

    public IEnumerator<decimal> GetEnumerator()
    {
        return mylist.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return mylist.GetEnumerator();
    }


    public Serie()
    {

    }

    public Serie(List<decimal> serie)
    {
        mylist = serie;
    }

    public Serie Add(decimal Value)
    {
        mylist.Add(Value);
        return this;
    }

    public double Count()
    {
        return mylist.Count;
    }

    public static Serie operator +(Serie left, decimal right)
    {
        List<decimal> temp = new List<decimal>();
        for (int i = 0; i < left.Count(); i++)
        {
            temp.Add(left[i] + right);
        }
        return new Serie(temp);
    }
}

并且您可能需要一个以上述类的示例用法,如下所示:
    static void Main(string[] args)
    {

        Serie s = new Serie();
        s.Add(1).Add(2);
        for (int i = 0; i < s.Count(); i++)
        {
            Console.WriteLine(s[i]);
        }
        Console.ReadLine();
    }

你还需要一个公共的 Add 方法才能使用集合初始化语法。 - LukeH
这也不起作用;我得到了一堆错误。 首先,GetEnumerator方法出现错误;“‘[Namespace].Serie’未实现接口成员‘System.Collections.IEnumerable.GetEnumerator()’。'[Namespace].Serie.GetEnumerator()'无法实现'System.Collections.IEnumerable.GetEnumerator()',因为它没有匹配的返回类型'System.Collections.IEnumerator'。” 然后,我在各个地方都得到了关于将十进制数列表添加到系列列表中的几个错误。我不确定你在这里想做什么... 我对此IEnumerable一无所知。 - Tommy R
@TommyRäjert,我已经更正了答案,并添加了一个使用该答案的示例。请检查一下 :) - Ali Adlavaran

1

从技术上讲,你所需要的就是实现相应的 Add 方法:

 public class Serie {
   //TODO: add required stuff here

   public void Add(int value) {
     //TODO: add required stuff here
   }
 }

 ...
 // Add method lets you use the syntax sugar 
 Serie S = new Serie() { 1, 2, 3, 4 };

然而,由于Serie看起来像是对List<T>类的扩展/封装,因此实现一些接口也是合理的,例如interface

  IEnumerable<Decimal>
  IReadOnlyList<Decimal>

据我所知,您需要实现 IEnumerable 接口,并且需要一个公共的 Add 方法以正确的签名。 - Joey

0

你必须实现 IEnumerable<decimal> 并实现一个方法 Add(decimal value) - 这个你已经完成了。

但是看一下你的代码,你应该重新思考一下你想做什么。它看起来有点不太结构化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接