【问题标题】:Is it possible to fill a HashTable with multiple keys from a Linq query?是否可以使用 Linq 查询中的多个键填充 HashTable?
【发布时间】:2011-08-02 22:30:40
【问题描述】:

我将数据从 SQL Server 数据库抓取到 DataTable 中,我使用 AsEnumerable 将其转换,然后使用一系列 Linq 语句进行分离。我的最终目标是获取那些 Linq 查询并让它为我生成一个 HashTable。所以代替匿名类型:

var facebookPosts
    = from f in results.AsEnumerable()
      where f.GetInt("SocialMediaTypeID").Equals(
          (int) SocialMediaRecordType.FacebookPost)
      select new {
          Headline = f.GetString("Headline"),
          Parameters = new Parameters(f.GetString("Parameters")),
          SocialMediaUserID = f.GetLong("SocialMediaUserID"),
          SocialMediaRecordID = f.GetLong("SocialMediaRecordID"),
          GravityScore = f.GetFloat("GravityScore"),
          NewsDate = f.GetDateTime("NewsDate", false),
          Template = "Facebook"
      };

我可以这样做:

var facebookPosts1
    = from f in results.AsEnumerable()
      where f.GetInt("SocialMediaTypeID").Equals(
          (int) SocialMediaRecordType.FacebookPost)
      select new Hashtable {
          { "Headline", f.GetString("Headline"),
            "SocialMediaUserID", f.GetLong("SocialMediaUserID"),
             etc... }                                    
      };

.NET 4.0 可以做到这一点吗?

编辑:为了澄清这个问题,我最终要做的是将 JSON 返回到浏览器。我的公司创建了一个派生自 HashTable 的 JsonObject 类,这就是我最终返回 Json 所必须使用的。我想要做的是在 results 中的每行创建一个 Hashtable(或 JsonObject),使用上面的示例,它有一个名为 Headline 的键,其值为 f.GetString("Headline"),另一个名为 SocialMediaUserID 的键,其值为 f.GetLong("SocialMediaUserID") 等等。 Facebookposts 最终将是一个 HashTable 或 JsonObject 的数组或 IEnumerable,每个都有几个键/值对。如果我不能这样做,我想我无法将 facebookPosts 操作到我需要的正确 JsonObject 结构中?我确实需要明确指定名称。

【问题讨论】:

  • 您为什么要寻找哈希表而不是字典?您是否仍打算显式指定名称,还是希望它遍历所有字段本身?如果是后者,它怎么知道使用哪个“getter”?您是在寻找每行 一个哈希表(所以是IEnumerable<HashTable>)还是一个整体?基本上,请澄清问题:)
  • @Rob:您的公司会不允许您使用 JSON.NET 之类的库自动将对象转换为 JSON 字符串吗?
  • @StriplingWarrior:不,因为他们已经有了自己的滚动。与此同时,由于时间关系,我求助于 Reflection 来提取信息并将其 Json 化。

标签: c# linq hashtable


【解决方案1】:

我对@9​​87654321@ 类了解不多,因为Dictionary 是.NET 的标准哈希表实现。像这样?

...
select new Dictionary<string, object>
                            {
                                {"Headline", f.GetString("Headline")},
                                {"SocialMediaUserID", f.GetLong("SocialMediaUserID")},
                                // etc..
                            };

或者,如果您碰巧可以访问System.Web

using System.Web.Routing;

facebookPosts1 = facebookPosts.Select(p => new RouteValueDictionary(p)).ToList();

【讨论】:

  • 当我尝试这样做时,SocialMediaUserID 所在的第二行显示“;预期”。如果我取出 Hashtable,所以它只是“选择新的”,我会收到大量错误。
  • @Rob:也许您应该创建一个实用方法来从字典创建哈希表?这样,您就可以利用所有标准的 .NET 内容来创建 Dictionary 本身,然后将其转换为在您公司的 JSON 转换器中使用。我假设您的公司不会让您实际将字典支持添加到 JSON 转换器本身。
【解决方案2】:

您尝试执行的操作不适合 .NET 泛型,因为您尝试读取的字段并不总是相同的类型。泛型的典型用法类似于Dictionary&lt;string, string&gt;,其中键和值的类型都是预先知道的。您还需要将其嵌套更深;如果您的示例可以正常工作,它将返回一个 IEnumerable&lt;Hashtable&gt;,这似乎不太好使用。

听起来您真正想要的是一个成熟的 ORM,它将返回一个强类型类的集合。使用实体框架,它将为您处理创建集合,而无需执行您在此处尝试执行的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2023-03-15
    相关资源
    最近更新 更多