c#:如何遍历列表<>,这是字典中的值?

时间:2016-03-03 14:57:10

标签: c# dictionary

现在我的字典中填入了一个帐户作为键,一个List作为值。我相信我的代码正在努力填充它。但我的下一步是遍历与特定键相关联的List,并对列表执行操作(获取每个字段的总和)。我不熟悉字典,所以我不确定如何访问值并执行操作。当我退出while循环时,我想做这个求和并在我的每个循环中打印出来。

1)如果我能弄清楚如何访问DataRecords中的每个字段(在foreach循环内),我可能会弄清楚如何进行求和。

2)还在寻找一种打印值的方法,以便我可以看到它是否正确填充。

static void Main(string[] args)
{
    Dictionary<string, List<DataRecord>> vSummaryResults = new Dictionary<string, List<DataRecord>>();

    while (!r.EndOfStream)
    {
        if (control == "1")
        {
            // Need to add List<Datarecords> into dictionary...
            if (vSummaryResults.ContainsKey(records.account))
            {
                vSummaryResults[records.account].Add(records);
            }
            else
            {
                vSummaryResults.Add(records.account, new List<DataRecord>());
                vSummaryResults[records.account].Add(records);
            }
        }
   }
   foreach (List<DataRecord> rec in vSummaryResults.Values)
   {
       Console.WriteLine(rec.);  dictionary.
   }
   vWriteFile.Close();
   Console.ReadLine();
}

这是我用作列表中对象的DataRecord类。

公共类DataRecord {     田..... }

6 个答案:

答案 0 :(得分:3)

对于字典上的迭代,我们使用KeyValuePair

foreach (KeyValuePair<string, List<DataRecord>> kvp in vSummaryResults)
{
  string key = kvp.Key;
  List<DataRecord> list = kvp.Value;

  Console.WriteLine("Key = {0}, contains {1} values:", key, list.Count);
  foreach (DataRecord rec in list)
  {
     Console.WriteLine("  - Value = {0}", rec.ToString()); // or whatever you do to put list value on the output
  }
}

答案 1 :(得分:1)

你有一本字典

Dictionary<string, List<DataRecord>> vSummaryResults = new Dictionary<string, List<DataRecord>>();

你可以做一个

foreach (List<DataRecord> recs in vSummaryResults.Values)
{
    foreach (DataRecord rec in recs)
       Console.WriteLine(rec.Something); 
}

您还没有指定DataRecord的外观,但您会获得一个列表列表。可能有一个可爱的Linq表达式可以做同样的事情。

答案 2 :(得分:1)

你需要在第一个循环中使用另一个循环来获取列表中的值。

foreach (List<DataRecord> rec in vSummaryResults.Values)
{
    foreach(DataRecord data in rec)
    {
        Console.WriteLine(data .YourProperty);
    }
}

如果您知道密钥:

foreach (List<DataRecord> rec in vSummaryResults[key])
{
    foreach(DataRecord data in rec)
    {
        Console.WriteLine(data .YourProperty);
    }
}

答案 3 :(得分:0)

我举了一个简单的例子。它是一个字符串列表,但你可以做object.ToString()来得到一些tekst;

要遍历键所包含的列表,您需要再次遍历该列表,这是第二个foreach所做的。

Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();

List<String> ls = new List<string>();

ls.Add("item1");
ls.Add("item2");

dictionary.Add("it1", ls);
dictionary.Add("it2", ls);

foreach (var item in dictionary)
{
    foreach(var it in item.Value)
    {
        Console.WriteLine(it);
    }
}

答案 4 :(得分:0)

通过阅读您的代码我理解它,您有一个字典,其中每个键都有一个DataRecord类型的列表。

使用当前循环

Regular list comprehension/Regular loop: 3.8275507260113955
Itertools.product/Regular loop: 2.764477888995316
Regular list comprehension/Generator: 0.00015614699805155396
Itertools.product/Generator: 2.8045845669985283

您遍历每个DataRecord类型的列表。要访问存储在每个列表中每个对象中的数据,您需要包含另一个foreach循环来遍历列表中的对象。

foreach (List<DataRecord> rec in vSummaryResults.Values)
    {
        Console.WriteLine(rec.);  dictionary.

    }

您无法修改foreach循环中的数据,但您可以添加更简单的数据结构来执行您想要的任何换向等。

答案 5 :(得分:0)

以下是我需要做的代码。按照我现在需要的方式工作,感谢大家的帮助。

    int iSumOpen = 0;
        foreach (KeyValuePair<string, List<DataRecord>> kvp in vSummaryResults)
        {
            string key = kvp.Key; //assigns key
            List<DataRecord> list = kvp.Value;  //assigns value

            Console.WriteLine("Key = {0}", key);
            iSumOpen = 0;
            foreach (DataRecord rec in list)
            {
                if (vSummaryResults.ContainsKey(key))
                {

                    iSumOpen += rec.open;

                }

                else
                {
                    vSummaryResults.Add(key, list);
                }

            }
            Console.WriteLine(iSumOpen);
        }