【问题标题】:How to Get Keys & Values of Dictionary inside an Array?如何在数组中获取字典的键和值?
【发布时间】:2018-02-07 12:30:30
【问题描述】:

查询(SQLite)结果将保存在字典中,字典将保存在数组中

string sql = "select * from account";
SqliteConnection m_dbConnection = new SqliteConnection("Data Source = database.sqlite");
m_dbConnection.Open();
SqliteCommand command = new SqliteCommand(sql, m_dbConnection);
SqliteDataReader reader = command.ExecuteReader();


// This is the array
List<Dictionary<string, string>>  array = new List<Dictionary<string, string>>();

while (reader.Read())
{

    Dictionary<string, string> dictionary = new Dictionary<string, string>();
    for (int a = 0; a< reader.FieldCount; a++)
    {

        if (!reader.IsDBNull(a))
        {
            string key = reader.GetName(a);
            string value = reader.GetString(a).ToString();


            dictionary.Add(key, value);
            //Dictionary will be saved in the array
            array.Add(new Dictionary<string, string>(dictionary));
        }
    }       
}

现在我尝试打印出数组中每个字典的键和值,但它只打印出以下内容

for (int i = 0; i < array.Count; i ++)
{
    Debug.WriteLine("array(" + i + ") Key=" + array[i].SelectMany(x=> x.Key) + "Value = " + array[i].SelectMany(x => x.Value)+ "\n \n");
}

array(x) Key=System.Linq.Enumerable+SelectManySingleSelectorIterator2[System.Collections.Generic.KeyValuePair2[System.String,System.String],System.Char]Value = System.Linq.Enumerable+SelectManySingleSelectorIterator2[System.Collections.Generic.KeyValuePair2[System. String,System.String],System.Char]

而不是值和键本身。为什么?

或者你有什么建议我可以不使用列表将字典保存为数组吗?谢谢你。

【问题讨论】:

    标签: c# arrays linq dictionary


    【解决方案1】:

    您当前的代码调用集合的默认 ToString() 而不是您所期望的。使用 string.Join 的值创建一个字符串:

    string.Join(",",array[i].Select(x=> x.Key))
    

    还可以使用Select 而不是SelectMany,因为您在每个项目中都有一个值,而不是嵌套集合。

    附带说明 - array 是一个不好的参数名称,更不用说它是一个列表而不是数组。

    但是我认为字典列表不是您想要的。您可能希望创建一个具有属性的自定义类型,其中为数据库中的一行检索到的每一列都是一个属性。

    【讨论】:

    • 您好吉拉德,谢谢您的回答。刚刚试了一下,效果很好!是的,以前我使用这种方式创建了一个名为 Account 的自定义类,该类具有数据库中的表等属性(名称、id、地址等),但有人建议我以这种方式将查询结果放入字典,其中键是列名,值是行。因此,每次数据库表更改时,我都不必更改自定义类。您如何看待这个想法?
    • @jeansusgodney - 我认为上课更好。 DB 架构不应该有太大变化,如果发生了变化,那么应该考虑使用不同类型的架构。一般来说,这是关系数据库和 OOP 语言之间的冲突。我建议研究像 EF/Nhibernate/... 这样的 ORM 并使用一个。会让生活更轻松。
    【解决方案2】:

    您编写代码的方式可以这样做:

    Debug.WriteLine("array(" + i + ") Key=" + array[i].Select(x => x.Key).FirstOrDefault() + "Value = " + array[i].Select(x => x.Value).FirstOrDefault() + "\n \n");
    

    如果每个字典只有一个键/对,我只是不明白为什么要创建字典列表

    【讨论】:

    • 字典共享相同的键(例如 name 或 id),因为键是列本身的名称。
    • 没问题...我只是提供了一个额外的选项,让您只使用 linq 即可获得您想要的东西;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多