C#DataTable to Dictionary有多个值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#DataTable to Dictionary有多个值相关的知识,希望对你有一定的参考价值。

我有一个DataTable,它返回如下数据:

APP | VERSION
____|________  
app1| 1.0
app1| 2.0
app1| 3.0
app2| 1.0
app3|  

如您所见,“app1”有多个版本,有些应用程序没有任何版本。我需要将这个Datatable结果存储在某种List中,以便以后在我的代码中使用,所以我想出了Dictionary,但是无法让它工作。这是我尝试过的:

    public static Dictionary<string, List<string>> AppVer()
        {
         string SQL = "SELECT column1, column2 FROM myTable a LEFT JOIN 
         myTable2 v ON v.ID_FK=a.ID_PK";
         Dictionary<string, List<string>> versions = new Dictionary<string, 
         List<string>>();

         DataTable dt = new DataTable();

            try
            {
                using (var conn = new OracleConnection(conn_string))
                {
                    conn.Open();

                    using (OracleCommand cmd = new OracleCommand(SQL, conn))
                    {
                        using (OracleDataAdapter dad = new OracleDataAdapter(cmd))
                        {
                            dad.Fill(dt);
                        }
                        versions = dt.AsEnumerable().ToDictionary<DataRow, string, List<string>>(row => row[0].ToString(), new List<string>(row=> row[1].ToString()));
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
             return versions;
        }

但是,我收到错误

“无法将lambda表达式转换为'string'类型,因为它不是委托类型”。

我怎么能将我的DataTable存储到字典?

编辑:

 Dictionary<string, List<Version>> all_versions =  AppVer();

            StringBuilder sb = new StringBuilder();

            foreach (var item in all_versions)
            {
                sb.AppendFormat("{0} - {1}{2}", item.Key, item.Value, Environment.NewLine);
            }

            string result = sb.ToString().TrimEnd();
            MessageBox.Show(result);
答案

你需要通过密钥GroupBy,然后你可以在组上使用ToList。你知道有一个你可以使用的Version级吗?所以我更喜欢Dictionary<string, List<Version>>

public static Dictionary<string, List<Version>> AppVer()
{
    Dictionary<string, List<Version>> versions = null;
    string SQL = "SELECT column1, column2 FROM myTable a LEFT JOIN myTable2 v ON v.ID_FK = a.ID_PK";
    var dt = new DataTable();

    try
    {
        using (var conn = new OracleConnection(conn_string))
        using (var da = new OracleDataAdapter(SQL, conn))
        {
            da.Fill(dt);
        }

        versions = dt.AsEnumerable()
            .GroupBy(r => r.Field<string>(0))
            .ToDictionary(
                g => g.Key, 
                g => g.Select(r => Version.Parse(r.Field<string>(1))).ToList());
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    return versions;
}

Version类的一个好处是它正确排序,所以10.1之后的2.1

另一答案
ILookup<string, string> myLookup = dt.AsEnumerable().ToLookup(row => row[0].ToString(), row => row[1].ToString());

IEnumerable<string> myValues = myLookup["app1"];

// Loop through lookup.
foreach(var group in myLookup)
{
    string key = group.Key;
    IEnumerable<string> myValues = group;

    Console.WriteLine("Group {0} has {1} elements", key, myValues);
}

以上是关于C#DataTable to Dictionary有多个值的主要内容,如果未能解决你的问题,请参考以下文章

DataTable转Dictionary

DataTable转List<Dictionary<string, object;;的两种方法

将 DataTable 转换为字典 C#

The method below converts an array of objects to a DataTable object in C#.

将 DataTable 转换为 List<T>

asp.net中Dictionary的用法