【问题标题】:Load the Data table content to the Dictionary将数据表内容加载到字典
【发布时间】:2016-12-27 10:17:51
【问题描述】:
public static Dictionary<string, object> LonView()
        {
            string sql = "SELECT Marks,Id FROM table4";
            using (SqlConnection Connection = new SqlConnection((@"DataSource")))
            {
                using (SqlCommand myCommand = new SqlCommand(sql, Connection))
                {
                    Connection.Open();
                    using (SqlDataReader myReader = myCommand.ExecuteReader())
                    {
                        DataTable dt = new DataTable();
                        dt.Load(myReader);
                        Connection.Close();
  Dictionary<string, object> lst = new Dictionary<string, object>();
                      var tableEnumerable = dt.AsEnumerable();
                        var tableArray = tableEnumerable.ToArray();
                foreach (var data in tableArray)
                        {
                      lst.Add(data["id"].ToString(),data["Marks"] as string);
                        }

return lst;
          }
      }
   }
}

我想将我的数据表列转换为字典并以数组{["A",30],["B",32],["C",45]} 形式返回字典。建议一些想法做我的任务。

【问题讨论】:

    标签: c# arrays dictionary


    【解决方案1】:

    看看这个例子:

            DataTable table = new DataTable();
            table.Columns.Add("Id", typeof(string));
            table.Columns.Add("Marks", typeof(int));
            table.Rows.Add(new object[] { "A", 50 });
            table.Rows.Add(new object[] { "B", 100 });
            table.Rows.Add(new object[] { "C", 200 });
    
            Dictionary<string, int> dict = new Dictionary<string, int>();
            foreach (DataRow row in table.Rows)
            {
                dict.Add(row[0].ToString(), Convert.ToInt32(row[1].ToString()));
            }
    
            var arr = dict.ToArray();
    

    这对你有帮助吗?

    确保您的查询不会返回重复的 ID 值(字典中的键),因为您会遇到异常。

    【讨论】:

    • 感谢您的回复。,实际上内容已完全加载到字典中。但是一列充当Key。我想在没有键的情况下加载。怎么办?@ Nino
    【解决方案2】:

    试试这个例子

    dt.AsEnumerable()
          .ToDictionary<DataRow, string, object>(row => row.Field<string>(0),
                                    row => row.Field<object>(1));
    

    这会对你有所帮助。

    【讨论】:

      【解决方案3】:

      你不必创建任何DataTable,临时Dictionary:一个简单的直接while循环就可以了

       string sql = 
         @"SELECT Marks,
                  Id 
             FROM table4";
      
       using (SqlConnection Connection = new SqlConnection((@"DataSource"))) {
         using (SqlCommand myCommand = new SqlCommand(sql, Connection)) {
           Connection.Open();
      
           // We don't know the final array's length; let's use a list as a buffer  
           List<string[]> buffer = new List<string[]>();
      
           using (SqlDataReader myReader = myCommand.ExecuteReader()) {
             while (myReader.Read())
               buffer.Add(new string[] {
                 Convert.ToString(myReader["id"]),
                 Convert.ToString(myReader["Marks"]),
               });
           } 
      
           return buffer.ToArray(); 
         }         
       }
      

      编辑:如果您出于某种目的想保留DataTable

       using (SqlConnection Connection = new SqlConnection((@"DataSource"))) {
         using (SqlCommand myCommand = new SqlCommand(sql, Connection)) {
           Connection.Open();
      
           using (SqlDataReader myReader = myCommand.ExecuteReader()) {
             DataTable dt = new DataTable();
             dt.Load(myReader);
      
             // You can obtain the string[][] array via Linq: 
             string[][] result = dt
               .AsEnumerable()
               .Select(record => new string[] {
                  Convert.ToString(record["id"]),
                  Convert.ToString(record["Marks"]), })
               .ToArray();
      
             ...
           }
           ... 
      

      【讨论】:

      • 是的,你是对的。,但我需要数据表来做一些事情。建议一些其他的想法。@Dmitry Bychenko
      • @monica:在这种情况下(保留DataTable dt),您可以通过 Linq 获取锯齿状数组(请参阅我的编辑)
      【解决方案4】:

      非常简单的请求:

              public static Dictionary<string, object> LonView()
              {
                  string sql = "SELECT Marks,Id FROM table4";
                  Dictionary<string, object> lst = null;
                  using (SqlConnection Connection = new SqlConnection((@"DataSource")))
                  {
                      using (SqlDataAdapter adapter = new SqlDataAdapter(sql, Connection))
                      {
                          DataTable dt = new DataTable();
                          adapter.Fill(dt);
                          Connection.Close();
                          lst = dt.AsEnumerable()
                              .GroupBy(x => x.Field<string>("Marks"), y => y.Field<object>("Id"))
                              .ToDictionary(x => x.Key, y => y.FirstOrDefault());
                      }
                  }
                  return lst;
      
               }
      

      如果数据库中的值为日期时间

              public static Dictionary<string, DateTime> LonView()
              {
                  string sql = "SELECT Marks,Id FROM table4";
                  Dictionary<string, DateTime> lst = null;
                  using (SqlConnection Connection = new SqlConnection((@"DataSource")))
                  {
                      using (SqlDataAdapter adapter = new SqlDataAdapter(sql, Connection))
                      {
                          DataTable dt = new DataTable();
                          adapter.Fill(dt);
                          Connection.Close();
                          lst = dt.AsEnumerable()
                              .GroupBy(x => x.Field<string>("Marks"), y => y.Field<DateTime>("Id"))
                              .ToDictionary(x => x.Key, y => y.FirstOrDefault());
                      }
                  }
                  return lst;
      
              }
      

      【讨论】:

      • 分组依据(x => x.Field("XX"), y => y.Field("YY"))。如果 XX 是日期时间并且 YY 是字符串,那么如何执行此操作? @jdweng​​span>
      • 尖括号中的类型必须与数据库中的列相同。因此,如果要将字符串转换为 DateTime,则在您的情况下,对象将是 y.Field("Id") 或 DateTime.Parse(y.Field("Id"))。
      • 看不懂,能不能写成代码形式?
      • 我更新了代码,假设数据库中的列是 DateTime。否则,您需要将字符串解析为 DateTime。
      • 错误:无法将类型 'System.Collections.Generic.Dictionary' 隐式转换为 'System.Collections.Generic.Dictionary' @jdweng​​span >
      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 2018-08-27
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多