【问题标题】:Simple(?) logic concerning HashSet关于 HashSet 的简单(?)逻辑
【发布时间】:2014-05-20 18:33:44
【问题描述】:

我有一个 HashSet,其中包含大约 50 个帖子,我想将它们两两配对到我的数据库中(帖子是一个 title 和一个 description 属于一起)。问题是我无法将逻辑放在一起。下面的代码可能更好地解释了我的想法:

foreach(string item in hash)
{
    // Here something that assigns every uneven HashSet-post to item1, the even ones to item2
    var NewsItem = new News 
    {
        NewsTitle = item1
        NewsDescription = item2
    };


    dbContext db = new dbContext();

    db.News.Add(NewsItem);
    db.SaveChanges();
}

【问题讨论】:

  • 如何定义“偶数”和“奇数”项? HashSet 没有“顺序”,因此它似乎不是满足您需求的正确数据结构。
  • 我将它们定义为 HashSet 中的第一项是奇数(1),第二项是偶数(2)等。我认为这是循环它们的最佳方式,因为它们在对。为了将正确的值插入到数据库中的正确列中。
  • @user3581054,参考HashSet的备注。 D Stanley 的意思是不能保证您将收到的结果的顺序。因此,您可以期待 title1、descr1、title2、descr2,但仍会收到 title1、title2、descr1、descr2 或任何其他排列。

标签: c# asp.net sql loops nested-loops


【解决方案1】:

您不能从基于哈希的容器中“配对”项目,因为从逻辑角度来看,这些容器是任意排序的 *

因此,当您将数据插入哈希集中时,您需要将标题和描述配对,如下所示:

class Message {
    public string Title {get;set;}
    public string Description {get;set;}
    public int GetHashCode() {return 31*Title.GetHashCode()+Description.GetHashCode();}
    public bool Equals(object other) {
        if (other == this) return true;
        Message obj = other as Message;
        if (obj == null) return false;
        return Title.Equals(obj.Title) && Description.Equals(obj.Description);
    }
}
ISet<Message> hash = new HashSet<Message>();

此时您可以将消息插入到您的哈希集中。通过参与单个 Message 对象,标题和描述将始终明确配对。

* Microsoft 当前的实现确实保持了插入顺序,但这是一个不幸的实现细节。

【讨论】:

  • 我会调查的!您是否有任何有用的文章供我学习,以便更好地理解该代码?我对编程很陌生。
  • @user3581054 我假设您理解声明属性TitleDescription 的两行,对吧?那么唯一重要的问题是哈希码和相等计算。您可以在this Microsoft articlethis answer 中了解更多信息。
  • 是的,我做到了 :) 谢谢
【解决方案2】:

我定义HashSet中的第一项是奇数(1),第二项是偶数(2),以此类推

那么HashSet 不是正确的数据结构。 HastSets 没有任何特定的顺序,所以如果您需要按顺序提取项目,那么普通的 List&lt;string&gt; 就可以了。

也就是说,做你需要的一种方法是使用一个for 循环来获取两个项目。 时间:

using(dbContext db = new dbContext())
{
    for(int i = 0; i < list.Count - 1; i += 2)
    {
        var NewsItem = new News 
        {
            NewsTitle = list[i];
            NewsDescription = list[i+1];
        };

        db.News.Add(NewsItem);
    }
}
db.SaveChanges();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2018-04-10
    • 2010-10-10
    • 2012-02-29
    相关资源
    最近更新 更多