检查字符串是否已添加到列表中c#

时间:2009-11-05 11:10:42

标签: c#

我正在研究一些我继承的c#。

我有一个问题,就是在输出中重复了两次,我想我已经在控制器中找到了这个内容;

if(!isDirectUK)
  rollingPriceSupp.Add(new KeyValuePair<string, float>("Personal Insurance",
                                                       (float)insuranceCost));
ViewData["vRollingPrice"] = rollingPriceSupp; 

如何检查该点是否已添加字符串“个人保险”,以避免重复两次?

4 个答案:

答案 0 :(得分:4)

您必须添加

if(rollingPriceSupp.ContainsKey("Personal Insurance")) 

在Add方法之前检查。

更新:自从看到OP评论以来,列表是使用List<KeyValuePair>集合实现的。在这种情况下,仅使用ContainsKey是行不通的。

仅从问题我发现他们使用某种Hashtable集合。在这种情况下,containsKey就足够了。 如果您无法将实现从List更改为Hashtable,那么解决方案是遍历项并检查它是否包含密钥。 E.g。

bool bItemExists = false;
foreach(KeyValuePair<string, float> pItem in rollingPriceSupp)
{
   if(pItem.Key == "Personal Insurance")
   {
      bItemExists = true;
      break;
   }
}
if(!bItemExists)
{
    rollingPriceSupp.Add(new KeyValuePair<string, float>("Personal Insurance",
                                                       (float)insuranceCost));
}

那应该为你做的伎俩。不是最有效的解决方案,但应该有效。

答案 1 :(得分:2)

IEnumerable扩展方法提供了多种可能性,包括Count:

var count = rollingPriceSupp.Count(x => x.Key.Equals("Personal Insurance"));
var containsMultiple = count > 1;

Where或FirstOrDefault方法也可能是不错的选择。

答案 2 :(得分:1)

如果正如Nikos Steiakakis所说,您使用的是List<KeyValuePair<string, float>>,那么我的问题是:为什么? 特别是如果您不想要重复键,你应该肯定使用Dictionary<string, float>,这是一个很好的小方益,你不必写:

rollingPriceSupp.Add(new KeyValuePair<string, float>("Personal Insurance",
                                                     (float)insuranceCost));

相反,你可以简单地写:

rollingPriceSupp.Add("Personal Insurance", (float)insuranceCost));

如果需要通过索引进行随机访问,那么我认为您可能确实需要使用List。在这种情况下,您可以使用FindIndex方法(无需扩展名):

// this function will give you a Predicate to check for any key
public Predicate<KeyValuePair<string, float>> GetMatcher(string key) {
    return (KeyValuePair<string, float> item) => { return item.Key == key; };
}

int index = rollingPriceSupp.FindIndex(GetMatcher("Personal Insurance"));
bool keyExists = (index != -1);

if (!keyExists && !isDirectUK) {
    rollingPriceSupp.Add(new KeyValuePair<string, float>("Personal Insurance",
                                                         (float)insuranceCost));
}

但请注意,这种方法(对重复键进行强力搜索)将需要迭代,因此具有O(n)性能,根据您的大小,这可能会也可能不会被接受List。如果性能是优先考虑的,并且您可以分配一些额外的内存,那么您可能需要考虑与列表并排保持HashSet<string>,以便在添加时执行以下操作:

HashSet<string> rollingPriceSuppKeys = new HashSet<string>();

if (!rollingPriceSuppKeys.Contains("Personal Insurance") && !isDirectUK) {
    rollingPriceSupp.Add(new KeyValuePair<string, float>("Personal Insurance",
                                                         (float)insuranceCost));
    rollingPriceSuppKeys.Add("Personal Insurance");
}

答案 3 :(得分:-1)

在词典对象上使用ContainsKey(key)实例方法。