我正在研究一些我继承的c#。
我有一个问题,就是在输出中重复了两次,我想我已经在控制器中找到了这个内容;
if(!isDirectUK)
rollingPriceSupp.Add(new KeyValuePair<string, float>("Personal Insurance",
(float)insuranceCost));
ViewData["vRollingPrice"] = rollingPriceSupp;
如何检查该点是否已添加字符串“个人保险”,以避免重复两次?
答案 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)实例方法。