【问题标题】:Trying to loop through a list of objects c# [closed]试图循环遍历对象列表c# [关闭]
【发布时间】:2012-12-18 08:11:30
【问题描述】:

尝试使用 foreach 循环遍历对象列表,但遇到编译器错误时遇到了麻烦

Foreach 语句无法对变量对象进行操作,因为它不包含GetEnumerator 的定义。

我将文件解析为匿名列表,然后在方法中使用该列表。

     var list = (from s in File.ReadAllLines(path).Select(a => a.Split(new[] { '|' }, StringSplitOptions.None))
                     select new
                     {
                         Nbr = s[0].Trim(),
                         Name = s[1].Trim(),
                         Phone = s[2].Trim(),
                         Addr = s[3].Trim()
                     }).ToList();
 findmatch(list);
}
  Public static void findmatch(object list)
 {
  foreach(var entry in list)

我也尝试像这样更改代码:

foreach(var entry in list.GetType().GetProperties()) as I still get this error

抱歉,是的,我进行了编辑以识别我正在将列表转移到另一个方法。

【问题讨论】:

  • 您可以删除ToList(),但是,它应该可以使用或不使用。
  • 如果我为File.ReadAllLines(path) 存根一些数据,它工作得很好:ideone.com/fSb0Na
  • 这不是你的真实代码。这可以正常工作并且编译得很好。如果您想在 StackOverflow 上提问,请展示一个简短而完整的示例,以便重现您遇到的问题。不要过于简单化。
  • @ERead:我刚刚用真实文件做了一个测试,它仍然有效。对于编译器而言,数据来自File.ReadAllLines 还是string 数组并不重要。
  • 没人关心那些解释。如果您需要帮助,我重复一遍:展示一个简短而完整的示例,以便重现您遇到的问题。带有 Main 方法的控制台应用程序就可以了。否则,您的问题将被关闭,因为它不是真正的问题。简单,简单,容易。正是我们希望您向我们展示的示例。

标签: c# object foreach


【解决方案1】:

问题与描述的完全一样:您不能在object 类型的变量上调用迭代器,因为它没有。你的方法需要一个object,所以你不能这样做。

您使用object 的原因显然是因为您将select 转换为匿名类型,因此您没有什么可以将List<T> 声明为。

您需要做的是定义一个具体类型,并让您的方法接受List<MyType>IEnumerable<MyType> 而不是object

【讨论】:

    【解决方案2】:

    好的,既然你已经展示了你的真实代码,那么问题出在哪里就很清楚了。匿名对象不能离开本地上下文。您不能循环遍历 object 的实例。而且你不能在定义这个匿名对象的上下文之外的任何地方使用这个匿名对象。

    所以从定义模型开始:

    public class MyModel
    {
        public string Nbr { get; set; }
        public string Name { get; set; }
        public string Phone { get; set; }
        public string Adr { get; set; }
    }
    

    然后调整您的 LINQ 查询以返回此模型的 IEnumerable,而不是一些匿名对象:

    var list = 
        from s in File.ReadAllLines(path).Select(a => a.Split(new[] { '|' }, StringSplitOptions.None))
        select new MyModel
        {         
            Nbr = s[0].Trim(),
            Name = s[1].Trim(),
            Phone = s[2].Trim(),
            Addr = s[3].Trim()
        };
    findmatch(list);
    

    最后调整您的 findmatch 方法以获取模型的 IEnumerable,而不是一些您无论如何都无法迭代的弱类型对象:

    public static void findmatch(IEnumerable<MyModel> list)
    {
        foreach(var entry in list)
        {
            // do whatever you intended to do with the entry previously
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 2013-05-29
      • 2015-06-27
      • 1970-01-01
      • 2023-03-09
      • 2014-01-23
      • 1970-01-01
      • 2019-04-29
      相关资源
      最近更新 更多