Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在未知数据结构上迭代?_C# - Fatal编程技术网

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,因此可以是列表或字典(或…)副本,我会对一个可行的解决方案感兴趣: