C# 如何获得钥匙&;数组中字典的值?

C# 如何获得钥匙&;数组中字典的值?,c#,arrays,linq,dictionary,C#,Arrays,Linq,Dictionary,查询(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); Sqlite

查询(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));
        }
    }       
}
string sql=“选择*来自帐户”;
SqliteConnection m_dbConnection=newsqliteconnection(“数据源=database.sqlite”);
m_dbConnection.Open();
SqliteCommand=newsqlitecommand(sql,m_dbConnection);
SqliteDataReader=command.ExecuteReader();
//这是数组
列表数组=新列表();
while(reader.Read())
{
字典=新字典();
对于(int a=0;a
现在我尝试打印出数组中每个字典的键和值,但它只打印出以下内容

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");
}
for(int i=0;ix.Key)+”Value=“+array[i]。SelectMany(x=>x.Value)+”\n\n”);
}
数组(x)Key=System.Linq.Enumerable+SelectManySingleSelectorIterator
2[System.Collections.Generic.KeyValuePair
2[System.String,System.String],System.Char]Value=System.Linq.Enumerable+SelectManySingleSelectorIterator
2[System.Collections.Generic.KeyValuePair
2[System.String,System.String],System.Char]

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


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

当前代码调用集合的默认
ToString()
,而不是您所期望的。使用以下命令创建具有值的字符串:

也可以使用
Select
而不是
SelectMany
,因为每个项目中只有一个值,而不是嵌套的集合

作为旁注-
array
对于参数来说是个坏名字,更不用说它是一个列表而不是数组了


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

您编写代码的方式可以做到这一点:

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

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

字典共享同一个键(例如名称或id),因为键是列本身的名称。没问题。。。我只是提供了一个额外的选项,仅使用linq;)即可获得您想要的内容嗨,吉拉德,谢谢你的回答。刚试过就成功了!是的,以前我使用这种方式创建了一个名为Account的自定义类,该类具有数据库中的表(名称、id、地址等)等属性,但有人建议我这样做,将查询结果放入字典,其中key是列名,value是行。所以每次数据库表更改时,我都不必更改自定义类。你觉得这个主意怎么样?@jeansusgodney-我认为上课更好。DB模式不应该改变太多,如果改变了,那么应该考虑另一种模式。通常,这是关系数据库和OOP语言之间的冲突。我建议研究像EF/Nhibernate/这样的ORM。。。然后用一个。会让生活更轻松。
Debug.WriteLine("array(" + i + ") Key=" + array[i].Select(x => x.Key).FirstOrDefault() + "Value = " + array[i].Select(x => x.Value).FirstOrDefault() + "\n \n");