尝试循环遍历c#对象列表

本文关键字:对象 列表 遍历 循环 | 更新日期: 2023-09-27 17:50:40

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

对不起,是的,我做了一个编辑,以识别我将list传递给另一个方法

尝试循环遍历c#对象列表

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

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

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

好了,现在您已经展示了实际代码,很明显问题出在哪里。匿名对象不能离开本地上下文。不能循环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
    }
}