-7

尝试使用 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

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

4

2 回答 2

4

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

显然,您使用 的原因是object因为您正在select进入匿名类型,因此您没有任何东西可以声明List<T>为。

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

于 2013-01-03T22:00:12.563 回答
3

好吧,既然你已经展示了你的真实代码,那么问题出在哪里就很清楚了。匿名对象不能离开本地上下文。您不能循环遍历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
    }
}
于 2013-01-03T22:01:39.207 回答