使用while循环访问字典的值

时间:2017-01-08 08:28:34

标签: c# visual-studio dictionary

我是否知道使用while循环访问字典值的最佳解决方案,而不是因为我已经有一段时间了,所以我可以减少程序中的行数到目前为止我做的是

while (da.Read())
 {
    Dictionary<string, decimal> d = b.findclosingbalanceofledger(da["LeId"].ToString());
    foreach (var pair in d)
    {
      MessageBox.Show(pair.Key);
      MessageBox.Show(pair.Value.ToString());
     }
  }

我想做的是

 while (da.Read())
 {
    Dictionary<string, decimal> d = b.findclosingbalanceofledger(da["LeId"].ToString());
    MessageBox.Show(pair.Key);
    MessageBox.Show(pair.Value.ToString());
  }

b.findclosingbalanceofledger(ID) 有以下代码

public Dictionary<string,decimal> findclosingbalanceofledger(string id)
        {
            decimal totalcredit = 0;
            decimal totaldebit = 0;
            decimal closingbalance =0;
            string  closingbalancetype;
            Dictionary<string, decimal> closingbalanceofledger = new Dictionary<string, decimal>();
           con.Open();
           string sql = @"select sum(Amount) as total,vocherType from Voucher where LedId=@LedId and vocherType=@Payment group by vocherType";
           using (SqlCommand cmd = new SqlCommand(sql, con))
           {
               cmd.Parameters.AddWithValue("@LedId",id);
               cmd.Parameters.AddWithValue("@Payment", "Payment");
               cmd.Parameters.AddWithValue("@Reciept", "Reciept");
               SqlDataReader dr = cmd.ExecuteReader();
               if(dr.HasRows)
               {
                   while (dr.Read())
                   {
                     totalcredit = System.Convert.ToDecimal(dr["sum"].ToString());
                   }
               }
           }
           con.Close();
           con.Open();
           string sql1 = @"select sum(Amount) as sum,vocherType from Voucher where LedId=@LedId and vocherType=@Reciept group by vocherType";
           using (SqlCommand cmd = new SqlCommand(sql1, con))
           {
               cmd.Parameters.AddWithValue("@LedId", id);
               cmd.Parameters.AddWithValue("@Payment", "Payment");
               cmd.Parameters.AddWithValue("@Reciept", "Reciept");
               SqlDataReader dr = cmd.ExecuteReader();
               if (dr.HasRows)
               {
                   while (dr.Read())
                   {
                       totaldebit = System.Convert.ToDecimal(dr["sum"].ToString());
                   }
               }
           }
           con.Close();
           if (totalcredit > totaldebit)
           {
               closingbalance = totalcredit - totaldebit;
               closingbalancetype = "credit";
           }
           else
           {
               closingbalance = totaldebit - totalcredit;
               closingbalancetype = "debit";
           }
           closingbalanceofledger.Add(closingbalancetype,closingbalance);
           return closingbalanceofledger;
        }

2 个答案:

答案 0 :(得分:1)

接受的答案是错误的,因为它依赖于未指明的行为;我引用Dictionary文档:

  

未指定Dictionary<TKey, TValue>.ValueCollection中值的顺序,但它与Keys属性返回的Dictionary<TKey, TValue>.KeyCollection中的关联键的顺序相同。

这意味着无论FirstOrDefault返回什么都未指定,并且可以根据当前的.NET框架,硬件,星期几,阳光下可观察的太阳黑子数等进行更改。

Values.FirstOrDefault的行为始终保持一致的唯一情况是集合是空的还是只有一个成员;但如果您确定只有一个成员,那么您为什么首先使用字典呢?尽管如此,如果是这样的话,正确的选项是Single(),它强制集合中必须只有一个成员。

现在,如果案例是您希望集合的第一个元素可以包含零个,一个或多个成员,那么这意味着您必须具有一些排序条件。那么,指定它:

是靠钥匙吗?

var first = myDictionary.OrderBy(kv => kv.Key).FirstOrDefault();

是值的某些属性吗?

var first = myDictionary.OrderBy(kv => kv.Value.Foo).FirstOrDefault();

如果您感兴趣的订单是元素添加到您的收藏中的顺序,那么不使用字典,请使用List或者,如果您愿意从语义上说清楚,Queue

答案 1 :(得分:0)

如果词典中包含 只有一个 值,则可以打印

MessageBox.Show(d.FirstOrDefault().Key + " " + d.FirstOrDefault().Value);