对于我的项目,我创建了一个字典,其中包含一个随机的double和一个属于该double的字符串:
Dictionary<double, string> myDict = new Dictionary<double, string>();
对于这个项目,我知道double是一个随机值,并且在字典中所有字符串都是唯一的,除了大约80%,其中一个是字典中的两倍。 所以我想要做的是找到两个字符串是一对(相同的字符串)并找到属于这两个字符串的2个双精度值。
基本上我这样做的想法是使用IEnumerator counter = myDict.GetEnumerator();
并使用while (counter.MoveNext() == true)
启动另一个IEnumerator,它再次循环遍历字典的所有条目并按字符串进行比较,因此如果找到对这条路。
因此,对于字典中的每个条目,它将再次遍历整个字典以查找对。
现在我觉得这可能不是解决这个问题的最佳解决方案。是否有替代方法可以找到字典中的对,或者这是通过唯一真正的方式循环?
答案 0 :(得分:3)
我相信,您希望Keys
获取Values
中有一对字符串的项目var result = myDict.GroupBy(r => r.Value)
.Where(grp => grp.Count() == 2)
.SelectMany(grp => grp.Select(subItem => subItem.Key))
.ToList();
。
.Where(grp => grp.Count() >= 2)
如果您想获取具有多个字符串值的项目的密钥,(两个以上),请将条件修改为:
Random
要添加的另一件事是,您在字典中添加了Random
个值的键。请注意,Unique
并不代表Dictionary
。由于Dictionary<double, string> myDict = new Dictionary<double, string>
{
{1, "ABC"},
{2, "ABC"},
{3,"DEF"},
{4,"DEF"},
{5,"DEF2"},
{6,"XYZ"}
};
键是唯一的,因此您可能会遇到异常。
如果您的字典定义为:
foreach (var d in result)
{
Console.WriteLine(d);
}
对于LINQ表达式后的输出:
1
2
3
4
输出:
{{1}}