关于HashSet的简单(?)逻辑

时间:2014-05-20 18:33:45

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

我有一个填充了大约50个帖子的HashSet,我希望将它们两个一对地放入我的数据库中(帖子分别是titledescription)。问题是我不能把逻辑放在一起。下面的代码可能会更好地解释我的想法:

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();
}

2 个答案:

答案 0 :(得分:3)

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

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

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当前的实现确实维护了插入顺序,但这是一个不幸的实现细节。

答案 1 :(得分:-1)

  

我定义HashSet中的第一项是奇数(1),第二项是偶数(2)等。

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

那就是说,做你需要的一种方法是使用一个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();