C# 在未知数据结构上迭代?
重复:C# 在未知数据结构上迭代?,c#,C#,重复: 当我运行以下代码时: foreach (object bar in list) { Console.WriteLine = bar; } 我得到以下输出: System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System
当我运行以下代码时:
foreach (object bar in list)
{
Console.WriteLine = bar;
}
我得到以下输出:
System.Collections.DictionaryEntry
System.Collections.DictionaryEntry
System.Collections.DictionaryEntry
System.Collections.DictionaryEntry
System.Collections.DictionaryEntry
System.Collections.DictionaryEntry
System.Collections.DictionaryEntry
但是我如何写出上面每一行的内容呢
foreach (DictionaryEntry entry in list)
{
Console.WriteLine("{0}={1}", entry.Key, entry.Value);
}
编辑:如果你想让它对任何东西起作用,并递归到结果中的任何对象(例如,根据Kloti的回答,递归到子对象[]),你基本上需要使用反射。我会这样做:
- 检查null(如果是,只需打印“null”)
- 使用GetType()查找对象的执行时间类型
- 拥有已知的漂亮打印机列表,例如列表、字典等。如果适用,委托给漂亮打印机
- 否则,请检查该类型是否重写ToString()-如果是,只需调用它并假设它知道它在做什么
- 否则,检查公共可读属性,并向下递归
object[]
)-请参阅
(呃,等等!你也是!你以前问过这个问题……重复?没有通用的解决方案可以遍历任何未知的数据结构。但是,您可以编写适用于已知类型集(如标量、字典、列表等)的递归算法,例如:
public void Dump(object obj)
{
if(obj is IList)
{
DumpList((IList)list);
}
else if(obj is IDictionary)
{
DumpDictionary(dict)
}
else
{
Console.WriteLine(obj);
}
}
public void DumpList(IList list)
{
foreach(object item in list)
{
Dump(item);
}
}
public void DumpDictionary(IDictionary dict)
{
foreach (DictionaryEntry entry in dict)
{
Dump(entry.Key);
Console.Write("=");
Dump(entry.Value);
}
}
对于更好、更可扩展的解决方案,您可以使用责任链模式,但我希望这个示例尽可能简单 约翰斯基特基本上回答了这个问题,但忽略了细节。 您需要将字典装箱到IDictionary接口中才能访问DirectoryEntry类
public void Test
{
Dictionary<string, object> objectList = new Dictionary<string, object>();
Dictionary<string, object> guidList = new Dictionary<string, Guid>();
IterateGenericDict(objectList);
IterateGenericDict(guidList);
}
public void IterateGenericDict(object obj)
{
foreach (DictionaryEntry entry in (IDictionary)obj)
{
Console.WriteLine(entry.Key + "=" entray.Value.ToString());
}
}
公共无效测试
{
Dictionary objectList=新建字典();
Dictionary guidList=新字典();
IterateGenericDict(objectList);
迭代器目录(guidList);
}
public void迭代器enericdict(object obj)
{
foreach(字典在(IDictionary)obj中输入条目)
{
Console.WriteLine(entry.Key+“=”entray.Value.ToString());
}
}
这适用于特定的示例,但如果我只知道列表实现为IEnumerable,因此可以是列表或字典(或…)副本,我会对一个可行的解决方案感兴趣: