对不起标题,但我不知道其他问题。
为易于解释而编辑
public Dictionary<string, string>[] getValuesDB(DataSet ds)
{
Dictionary<string, string>[] info;
Dictionary<string, string>[] temp = new Dictionary<string, string>[ds.Tables[0].Rows.Count];
Dictionary<string, string> d;
string ciclo = "CICLO 02";
try
{
for (int c = 0; c < ds.Tables[0].Rows.Count; c++)
{
d = new Dictionary<string, string>();
OracleConn ora = OracleConn.getInstancia();
DataSet oraDs = ora.getClientByCycle(ds.Tables[0].Columns["IDCliente"].Table.Rows[c].ItemArray[1].ToString(), ciclo);
if (oraDs.Tables[0].Rows.Count > 0)
{
oraDs.Tables[0].Columns[5].Table.Rows[0].ToString();
d.Add("DomID", ds.Tables[0].Columns["DomID"].Table.Rows[c].ItemArray[0].ToString());
d.Add("ClientID", ds.Tables[0].Columns["ClientID"].Table.Rows[c].ItemArray[1].ToString());
d.Add("AccountType", ds.Tables[0].Columns["AccountType"].Table.Rows[c].ItemArray[2].ToString());
temp[c] = d;
}
}
}
catch (Exception eo)
{
}
int count = 0;
for (int i = 0; i < temp.Length; i++)
{
if (temp[i] != null)
count++;
}
info = new Dictionary<string, string>[count];
return info;
现在我需要从'temp'获取所有非空值并将其放入info 任何想法
答案 0 :(得分:3)
试试这个
Dictionary<string, string> dictionaryWithoutNulls ;
dictionaryWithoutNulls = dictionaryWithNulls
.Where(d => d.Value != null)
.ToDictionary(s=>s.Key, s=>s.Value);
答案 1 :(得分:1)
一个简单,直接,不漂亮的答案,适用于.NET 2.0并尽可能少地扰乱代码:
// ...code
info = new Dictionary<string, string>[count];
// Beginning of new code
int j = 0;
foreach (Dictionary<string, string> fromTemp in temp)
{
if (fromTemp == null)
continue;
info[j] = fromTemp;
j++;
}
// End of new code
return info;
但是,您的代码段有几个问题需要更正。如果您已经了解这些事情并且为了简洁起见而没有这样做,请原谅我。如果是这种情况,希望其他人能够从这些评论中学习。
Dictionary<string, string>[]
一系列词典不是很自我解释,似乎没什么用处。字典非常适合通过键查找值,但是一旦将一堆这些字典放在数组中并删除空值,似乎很难找出所需的字典。
由于我不知道您打算如何处理此方法的结果,因此很难推荐替代方案。也许尝试IDictionary<string, IDictionary<string, string>>
,使用ds.Tables[0].Columns["IDCliente"].Table.Rows[c].ItemArray[1].ToString()
作为外部词典的键。这样可以更容易地在结果中定位值。或者你可以试试IList<IDictionary<string, string>>
。当您添加新元素时,其中任何一个都能够自动调整大小,从而无需计算非空值并分配新数组。自动调整大小会影响性能,因此如果可以,请使用适当的容量初始化集合。
再次查看代码后,似乎每个字典都获得相同的三个密钥。为此使用一个类更合适:
public class ClientInfo
{
private string _domID;
public string DomID
{
get { return _domID; }
set { _domID = value; }
}
// ... also add properties for ClientID and AccountType
}
然后返回值可能类似于IList<ClientInfo>
。
我猜测ora.getClientByCycle(...)
是一个数据库查询。几乎总是可以一起重写查询或批处理查询,这样您只需要对数据库进行一次往返。即使它是一个快速查询,它仍然可能是这种方法中最慢的一行。查询数据库一次而不是ds.Tables[0].Rows.Count
次。
System.Exception
// !!! Don't do this!!!
catch (Exception eo)
{ }
如果数据库查询在某些情况下可能会失败并且您对此感到满意,那么catch (OracleException)
。始终抓住最具体的例外情况。否则,catch块可能会捕获并忽略您不期望的其他异常。然后您的程序行为不正确,并且您没有有用的异常信息来帮助您进行调试。有关详细信息,请参阅http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx。