如何过滤字典以使项具有惟一值



如果你认为我在问之前没有做足够的研究,请原谅我

刚刚遇到一个业务需求,我们必须确保字典中的值是唯一的。也就是说,我们应该过滤一个字典,并且这种过滤的结果应该是具有唯一值的键值对。

顺便说一句,它是一个简单的字典,包含字符串值和字符串键。为了更清楚地说明,下面是示例输入和预期输出值—
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"

相关内容

  • 没有找到相关文章

最新更新