如何在不使用LINQ的情况下使Dictionary中的所有键具有相同的值

时间:2017-09-20 07:20:58

标签: c# dictionary

我有这个:

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。那么我还能采取其他方法吗?

2 个答案:

答案 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);
}