尝试循环遍历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传递给另一个方法
问题正如所描述的那样:您不能在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
}
}