如果你认为我在问之前没有做足够的研究,请原谅我
刚刚遇到一个业务需求,我们必须确保字典中的值是唯一的。也就是说,我们应该过滤一个字典,并且这种过滤的结果应该是具有唯一值的键值对。
顺便说一句,它是一个简单的字典,包含字符串值和字符串键。为了更清楚地说明,下面是示例输入和预期输出值—
sourceDictionary将具有如下值(只是为了表示数据,语法不正确)-{{"Item1","Item One"},{"Item11","Item One"},{"Item2","Item Two"},{"Item22","Item Two"}}对于这个输入,filteredDictionary应该看起来像下面-{{"Item1","Item One"},{"Item2","Item Two"}}
我提出的解决方案是有效的
var sourceDictionary = serviceAgent.GetSampleDictionary(); // Simplified for brevity
var filteredDictionary =
sourceDictionary.GroupBy(s => s.Value)
.Where(group => @group.Any())
.Select(g => g.First())
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
我是不是讲了太多逻辑了?或者,换句话说,有没有更简单的方法?
这一行:
.Where(group => @group.Any())
是不必要的,因为无论如何都不会得到任何空组。(也不确定"@"是什么意思。)
除此之外,没有更简单的方法了
你的方法工作,但它不是非常可读。如果你这样创建你的类:
class DictionaryValueComparer<T1, T2> : IEqualityComparer<KeyValuePair<T1, T2>>
{
public bool Equals(KeyValuePair<T1, T2> x, KeyValuePair<T1, T2> y)
{
return x.Value.Equals(y.Value);
}
public int GetHashCode(KeyValuePair<T1, T2> obj)
{
return obj.Value.GetHashCode();
}
}
那么你可以将你的方法简化为:
dictionary = dictionary.Distinct(new DictionaryValueComparer<int, string>()).
ToDictionary(p => p.Key, p => p.Value);
为什么不使用Linq扩展方法。distinct ()?
假设它不是自定义类型(那么您需要实现IEqualityComparer<YourType>
并将其传递给Distinct
)
var distinctDict = sourceDictionary
.ToDictionary(kv => kv.Key, kv => kv.Value.Distinct());
var sourceDictionary=new Dictionary<string, List<string>>();
sourceDictionary.Add("A", new List<string>() { "A", "A", "B"});
sourceDictionary.Add("B", new List<string>() { "C", "D", "D" });
var distinctDict = sourceDictionary.ToDictionary(kv => kv.Key, kv => kv.Value.Distinct());
foreach(var kv in distinctDict)
Console.WriteLine("Key:{0} Values:{1}", kv.Key, string.Join(",", kv.Value));
// "A", "B" and "C", "D"