从列表到列表分配值,不包括空值

时间:2010-03-17 20:13:44

标签: c#

对不起标题,但我不知道其他问题。

为易于解释而编辑

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 任何想法

2 个答案:

答案 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;

更好的答案

但是,您的代码段有几个问题需要更正。如果您已经了解这些事情并且为了简洁起见而没有这样做,请原谅我。如果是这种情况,希望其他人能够从这些评论中学习。

1。返回类型: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>

2。查询循环内的数据库

我猜测ora.getClientByCycle(...)是一个数据库查询。几乎总是可以一起重写查询或批处理查询,这样您只需要对数据库进行一次往返。即使它是一个快速查询,它仍然可能是这种方法中最慢的一行。查询数据库一次而不是ds.Tables[0].Rows.Count次。

3。吞咽System.Exception

// !!! Don't do this!!!
catch (Exception eo)
{ }

如果数据库查询在某些情况下可能会失败并且您对此感到满意,那么catch (OracleException)。始终抓住最具体的例外情况。否则,catch块可能会捕获并忽略您不期望的其他异常。然后您的程序行为不正确,并且您没有有用的异常信息来帮助您进行调试。有关详细信息,请参阅http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx