我有这个:
Dictionary<integer, string> dictTempKeys = new Dictionary<integer, string>();
我想选择字典中包含相同值的所有键。 我可以使用LINQ as:
来做到这一点var duplicateValues = dictTempKeys.GroupBy(xx => xx.Value).Where(xx => xx.Count() > 1);
LINQ的答案已经给出here,但我不想在我的代码中使用LINQ,因为我将在C#CLR存储过程中使用此代码并且不支持LINQ。那么我还能采取其他方法吗?
答案 0 :(得分:3)
这是我的尝试 - 一种通用的扩展方法。
第一个foreach
循环遍历源字典并将其转换为查找,其中键是源的值,值是整数,表示源字典中源值的出现次数。
第二个foreach
循环将使用IEnumerable
语句为您提供yield return
。
public static IEnumerable<TValue> GetNonUniqueValues<TKey, TValue>(this IDictionary<TKey, TValue> source)
{
Dictionary<TValue, int> results = new Dictionary<TValue, int>();
foreach (var kvp in source)
{
int count;
if (results.TryGetValue(kvp.Value, out count))
{
count++;
}
else
{
count = 1;
}
results[kvp.Value] = count;
}
foreach (var kvp in results)
{
if (kvp.Value > 1)
{
yield return kvp.Key;
}
}
}
答案 1 :(得分:0)
您可以使用简单的foreach
循环并反转您的词典:
Dictionary<string, List<int>> keysByValue = new Dictionary<string, List<int>>();
foreach (KeyValuePair<int, string> entry in dictTempKeys {
List<int> keys;
bool hasKeys = keysByValue.TryGet(entry.Value, out keys);
if (!hasKeys) {
keys = new List<int>();
keysByValue.Add(entry.Value, keys);
}
keys.Add(entry.Key);
}