4

我必须实现一个序列化/反序列化类,并且我正在使用System.Xml.Serialization. 我有一些IList<Decimal>类型属性,并希望在IList<string>解码属于具有特定文化信息的列表的所有十进制值时进行序列化。例如1010,00带有意大利文化信息但10.00带有英语文化信息。我试着用这个来做到这一点:

public IList<string> method()
    {
        for (int i = 0; i < 1000; i++)
        {
            yield return i.ToString();
        }
    }   

但我在编译时得到错误 33

The body of 'Class1.method()' cannot be an iterator block because 'System.Collections.Generic.IList<string>' is not an iterator interface type

如果我将其用作属性类型IEnumerable<string>,它会成功运行,但显然我无法更改我想要序列化的数据类型。

任何帮助表示赞赏。

4

2 回答 2

7

yield仅适用于、 和IEnumerable<T>作为IEnumerable返回类型。 在您的情况下,您需要改用普通方法:IEnumerator<T>IEnumerator

public IList<string> method()
{
    var result = new List<string>();
    for (int i = 0; i < 1000; i++)
    {
        result.Add(i.ToString());
    }
    return result;
}

想想看。您的代码将允许您编写以下代码:

method().Add("foo");

这没有太多意义,不是吗?

于 2012-11-22T13:38:20.773 回答
2

您还可以将迭代器块移动到私有方法或 getter,如下所示:

public IList<string> method()
{
  return seq.ToList();
}

IEnumerable<string> seq
{
  get
  {
    for (int i = 0; i < 1000; i++)
    {
      yield return i.ToString();
    }
  }
}

但还要注意,对于范围的特定情况,x : x+1 : x+2 : ... : x+(n-1).NET 中已经有Enumerable.Range您可以像这样使用的方法:

public IList<string> method()
{
  return Enumerable.Range(0, 1000).Select(i => i.ToString()).ToList();
}
于 2012-12-01T10:56:06.593 回答