产生IList返回类型

时间:2012-11-22 13:35:40

标签: c# ienumerable yield ilist

我必须实现一个序列化/反序列化类,我正在使用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>,它可以成功运行,但很明显我无法更改我想要序列化的数据类型。

感谢任何帮助。

2 个答案:

答案 0 :(得分:7)

yield仅适用于IEnumerable<T>IEnumerableIEnumerator<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");

这没有多大意义,是吗?

答案 1 :(得分: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();
}