【问题标题】:Adding unique items to List or other object将唯一项目添加到列表或其他对象
【发布时间】:2013-12-29 21:09:59
【问题描述】:

我正在尝试找到一种将唯一数值添加到列表的有效方法。目前,我正在使用Dictionary<int,int> 对象。第一个值是生成的数字;只要它的生成可以在相同的情况下重复,它是什么都没关系。第二项是原件。所以,我会这样:

Dictionary<int,int> orderedList = new Dictionary<int,int>(MaxNoOfTimes);

for (i = 0; i<MaxNoOfTimes, i++)
{   
    int j = getNewValue();

    retry:
    try
    {
        orderedList.Add(j,i);
    }
    catch (ArgumentException ex)
    {  

        goto retry;
    }

虽然这可行,但它似乎不合适,我认为由于异常处理,它非常慢。 MaxNoOftimes 的值可以达到几个 1000(实际上没有实际限制,但很少有超过几个 1000)。有没有更快的方法?完成将值添加到orderedList 后,我​​从orderedList 创建一个SortList。

【问题讨论】:

  • 你为什么使用i++两次?什么可能导致ArgumentException
  • @JeroenVannevel 当字典中已经存在元素时,您会得到ArgumentException
  • 我认为 Hashset 将是您正在寻找的。它的 Add 方法返回一个布尔值是否被添加到集合中。
  • @MarcinJuraszek:你是对的,错过了。 @Ron:你为什么不直接用ContainsKey()检查它是否存在?
  • 你确定它有效吗?您不会更改j,这是您进入的关键

标签: c# dictionary unique


【解决方案1】:

怎么样:

for (i = 0; i<MaxNoOfTimes, i++)
{   
    int j = getNewValue();

    while(orderedList.ContainsKey(j))
    {
        j = getNewValue();
    }

    orderedList.Add(j, i);
}

【讨论】:

  • 我会试一试,但我唯一担心的是无限循环的可能性。
  • 需要更多的测试,但我想说 99% 的时间是由于异常。现在,它很快!谢谢!
【解决方案2】:

怎么样:

Hashset<int> orderedSet = new Hashset<int>();
while(orderedSet.Count < maxNoTimes)
{   
   int j = getNewValue();
   orderedSet.Add(j);
}

既然你说你需要每个值的序数,那么这可能就是你在订购时想要的:

var orderedDictionary = orderedSet.ToDictionary(i => orderedSet.ToList().IndexOf(i), i => i).OrderBy(i => i.Value);

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多