迭代未知的数据结构?

时间:2009-01-09 11:48:29

标签: c#

重复C# Accessing data in System.Object[]


当我运行以下代码时:

    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

但是如何写出上面每一行的内容?

4 个答案:

答案 0 :(得分:4)

foreach (DictionaryEntry entry in list)
{
    Console.WriteLine("{0}={1}", entry.Key, entry.Value);
}

编辑:如果你希望它适用于任何,并递归到结果中的任何对象(例如根据Kloti的回复进入子对象[])你基本上需要用反射。我会做这样的事情:

  • 检查是否为null(如果是,则只打印“null”)
  • 使用GetType()
  • 找出对象的执行时间类型
  • 有一个已知的漂亮打印机列表,例如对于列表,词典等。如果适用,请委托给漂亮的打印机。
  • 否则,检查类型是否覆盖ToString() - 如果是这样,只需调用它并假设它知道它在做什么。
  • 否则,请检查公共可读属性,然后递减。

我怀疑有些图书馆可以在某个地方执行此操作,但我没有人可以处理。

答案 1 :(得分:0)

重新审核第二个问题(object[]) - 请参阅here

(呃,坚持下去!那也是你!你之前问过这个问题......重复吗?)

答案 2 :(得分:0)

没有可以遍历任何未知数据结构的通用解决方案。但是,您可以编写一个递归算法,该算法适用于一组已知类型(如标量,字典,列表等),例如:

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);
    }
}

对于更好,更可扩展的解决方案,您可以使用责任链模式,但我希望尽可能简单地保持此示例。

答案 3 :(得分:0)

JohnSkeet基本上回答了,但错过了细节。 您需要将字典打包到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());
  }
}