【问题标题】:Looping through a List循环遍历列表
【发布时间】:2013-06-22 11:02:47
【问题描述】:

好的,我有一个类如下:

public class MT101
    {

        // Sequence A
        public string tag20 { get; set; }  // 16x
        public string tag21R { get; set; } // 16x
        public string tag28D { get; set; } // 16x
        public List<String> tag50;         // Option F, G, H, C, or L
      }

然后我有一个方法,它使所述类的新实例如下:

    public class CheckMessage
    {
        private List<MT101> Message101 = new List<MT101>();
        public List<MT101> CheckMt101Message(string[] messageBody)
        {
            MT101 buildMessage = new MT101();
            .
            .
            . perform all the neccessary logic to add into buildMessage and then return the
            . Message101 object
            Message101.Add(buildMessage);
            return Message101;
        }
     }

我这样从另一个类调用方法:

  GlobalClasses.CheckMessage gm = new GlobalClasses.CheckMessage();

并像这样传递变量:

  string[] _block4 = Regex.Split(trimmed, @"\r\n");
  gm.CheckMt101Message(_block4);

        foreach (GlobalClasses.CheckMessage item in gm)
        { }

在 Visual Studio 中,编译时出现以下错误:

错误 1 ​​GlobalClasses.MT101.System.Collections.IEnumerable.GetEnumerator()':包含类型未实现接口 'System.Collections.IEnumerable'

错误 2 foreach 语句无法对“GlobalClasses.CheckMessage”类型的变量进行操作,因为“SASMI.GlobalClasses.CheckMessage”不包含“GetEnumerator”的公共定义

我在谷歌上搜索并找到了将 IEnumerable 设置为类的参考,所以我试过这个:

公开课 Mt101:IEnumberable

报告相同的消息。

【问题讨论】:

  • 你试图迭代什么集合/列表??
  • 错误的哪一部分你不明白?你的foreach 没有意义。
  • CheckMessage 不是IEnumerable
  • gm 是一个类而不是一个列表,我什至不知道从哪里开始你真的需要重新考虑这一点。
  • 问题在这里foreach (GlobalClasses.CheckMessage item in gm)

标签: c# list class foreach


【解决方案1】:

如果您想使用对类 CheckMessage 的引用对内部 List 进行迭代,那么您需要实现一个返回 IEnumerator 的函数,如下所示

在 CheckMessage 类中

    public IEnumerator<MT101> GetEnumerator()
    {
        foreach (MT101 m in this.Message101)
        {
             yield return m;
        }
    }

在您的代码中

  foreach(MT101 m in gm)
  {
      .....
  }

当然,您也可以在 CheckMt101Message 的返回值上执行 foreach,但 yield keyword 有几个优点。您只需要对 CheckMessage 类的引用,您不需要公开您的内部列表,您可以随时仅使用 CheckMessage 引用执行循环,您可以在 yeld 之前和之后添加自定义代码。

【讨论】:

  • 嗨,史蒂夫,不能接受两个 amswers,否则这也会打勾。
  • 这是你的选择,没问题。我支持我的答案,因为我认为它会产生更好的代码。
【解决方案2】:

我猜你想遍历类中Message101 字段中的MT101 对象。完成此操作的最简单方法是将Message101 公开,例如:

public class CheckMessage
{
    private List<MT101> message101 = new List<MT101>();

    public List<MT101> Messge101 { get { return message101; } }

    public List<MT101> CheckMt101Message(string[] messageBody)
    {
        MT101 buildMessage = new MT101();
        .
        .
        . perform all the neccessary logic to add into buildMessage and then return the
        . Message101 object
        Message101.Add(buildMessage);
        return Message101;
    }
}

然后你可以遍历这些对象:

foreach (MT101 item in gm.Message101)
{
    // ...
}

【讨论】:

  • foreach 中的项目类型应该是MT101,而不是GlobalClasses.CheckMessage 或只是var
  • 感谢您抓住那个 :)。
  • 干杯彼得,它排序了
【解决方案3】:

这是遍历循环的过程之一

EMP oeemp= new EMP();
            List<EMP> tr= new List<EMP>();
            foreach(var t in tr)
            {
            }

【讨论】:

    【解决方案4】:

    你必须这样做

    foreach (MT101 item in gm.CheckMt101Message(_block4)) { ... }
    

    恐怕你有很大的困惑,所以我建议你自己检查一下你的代码为什么不起作用,这对你来说比复制粘贴任何提供的解决方案更有帮助。

    【讨论】:

    • 这也有效。但是,这需要您添加一个块才能对其进行迭代。如果你只是将CheckMt101Message 的结果复制到一个变量中,你不必添加一个块来遍历列表。
    • 好的,关于这个有很多回复。彼得,你说得对,我想遍历这个类。我的想法是我可以构建一个对象,它可以包含单个字符串或字符串列表。然后我需要遍历每一个对它们进行进一步的检查。
    【解决方案5】:

    您忽略了CheckMt101Message 的返回值,而是尝试迭代类本身。那是行不通的。保存返回值并对其进行迭代:

    var messages = gm.CheckMt101Message(_block4);
    
    foreach (Mt101 item in messages)
    { 
        ... 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2018-10-26
      • 2013-09-04
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多