Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何筛选字典,使其包含具有唯一值的项?_C#_.net_Linq - Fatal编程技术网

C# 如何筛选字典,使其包含具有唯一值的项?

C# 如何筛选字典,使其包含具有唯一值的项?,c#,.net,linq,C#,.net,Linq,如果你认为我在询问之前没有做足够的研究,请原谅我 问题 刚刚遇到一个业务需求,我们必须确保字典中的值是唯一的。i、 例如,我们应该过滤一个字典,这样过滤的结果应该有具有唯一值的键值对 顺便说一句,它是一个简单的字典,有字符串值和字符串键。为了进一步澄清,以下是示例输入和预期输出值- sourceDictionary的值如下(只是为了表示数据,语法不正确){{“Item1”、“Item1”}、{“Item1”、“Item1”}、{“Item1”、“Item1”}、{“Item2”、“Item2”}

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

问题 刚刚遇到一个业务需求,我们必须确保字典中的值是唯一的。i、 例如,我们应该过滤一个字典,这样过滤的结果应该有具有唯一值的键值对

顺便说一句,它是一个简单的字典,有字符串值和字符串键。为了进一步澄清,以下是示例输入和预期输出值-
sourceDictionary的值如下(只是为了表示数据,语法不正确){{“Item1”、“Item1”}、{“Item1”、“Item1”}、{“Item1”、“Item1”}、{“Item2”、“Item2”}、{“Item22”、“Item2”}对于这个输入,filteredDictionary应该如下-{“Item1”、“Item1”}、{“Item2”、“Item2”}

我提出的有效解决方案

    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);  
问题
我是不是太有逻辑了?或者,换句话说,有没有更简单的方法来实现这一点?

为什么不使用Linq扩展方法。Distinct()?

这行:

.Where(group => @group.Any()) 
是不必要的,因为您无论如何都不会得到任何空组。(也不确定@是用来做什么的。)


除此之外,没有更简单的方法来实现这一点。

假设它不是自定义类型(那么您需要实现并将其传递给
Distinct

var sourceDictionary=newdictionary();
添加(“A”,新列表(){“A”,“A”,“B”});
添加(“B”,新列表(){“C”,“D”,“D”});
var distinctDict=sourceDictionary.ToDictionary(kv=>kv.Key,kv=>kv.Value.Distinct());
foreach(距离中的var kv)
WriteLine(“Key:{0}值:{1}”,kv.Key,string.Join(“,”,kv.Value));
//“A”、“B”和“C”、“D”

您的方法可行,但可读性不强。如果以这种方式创建类:

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();
    }
}
class DictionaryValueComparer:IEqualityComparer
{
公共布尔等于(键值对x、键值对y)
{
返回x.Value等于(y.Value);
}
public int GetHashCode(KeyValuePair obj)
{
返回obj.Value.GetHashCode();
}
}
然后,您可以将方法简化为:

dictionary = dictionary.Distinct(new DictionaryValueComparer<int, string>()).
    ToDictionary(p => p.Key, p => p.Value);
dictionary=dictionary.Distinct(新DictionaryValueComparer())。
ToDictionary(p=>p.Key,p=>p.Value);

组中的
@
是什么。Any()?这是错别字吗?@Rotem“@”允许你使用C#保留字。我相信这是一个更清晰的东西。。。可能是因为它认为这个团体是保守派keyword@JTA谢谢,我不知道。@Thimmarasau-是的:这就是我所想的,但是,无法在不同的调用中使用正确的谓词。你没有误解这个问题吗?我认为源字典
Value
类型不是可枚举的,但OP不希望字典中的两个键具有相同的值。很抱歉,我缺少类型信息。编辑问题以指示类型。@Rotem:“我们必须确保字典中的值是唯一的。也就是说,我们应该过滤字典,过滤结果应该具有具有唯一值的键值对。”编辑:htmm,是的,也许我以不同的方式理解了这个问题;)罗特姆是对的。我基本上希望生成的字典具有唯一的键(显然:)和唯一的值。@Rotem:我不会编辑或删除它,因为其他人已经以OP希望的方式回答了这个问题。但它可能会有助于一些人谁遇到这个标题。我同意。Where子句是多余的,我明白你的意思。我想我应该试试这个,因为我使用了很多类型字典的查找实体。@TimSchmelter我可以问一下构造函数会有什么帮助,因为它只比较键吗?+1,这比
GroupBy
更有效,在调用时更紧凑(如果你不介意把比较器类藏在某处的话)。
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);