我是否知道使用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;
}
答案 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);