C# 在字符串不相等的两个字符串字典之间查找;林克

C# 在字符串不相等的两个字符串字典之间查找;林克,c#,linq,dictionary,C#,Linq,Dictionary,我有两本字典 dicA从数据库填充,dicB从Excel列填充 dic.Values可能等于dic.Values,但大多数情况下dic.Values包含dic.Values 问题: 我想在dicB中找到包含dicA.Values的所有值,并添加到新字典dicNew,dicNew.Key=dicA.Key和dicNew.Values=dicB.Values 我的解决方案 我写了这段代码: Dictionary<string,string> res = new Dictionary&l

我有两本字典

dicA
从数据库填充,
dicB
从Excel列填充

dic.Values
可能等于
dic.Values
,但大多数情况下
dic.Values
包含
dic.Values

问题: 我想在
dicB
中找到包含
dicA.Values
的所有值,并添加到新字典
dicNew
dicNew.Key=dicA.Key
dicNew.Values=dicB.Values

我的解决方案 我写了这段代码:

 Dictionary<string,string> res = new Dictionary<string, string>();
        foreach (var s in dicB)
        {
            var data = dicA.Where(x => x.Value.Contains(s.Value)).ToList();
                //check if data.count==1 add to autoBind
                //    autoBind.Add(data[0].Key,data[0].Value);
                // else find in data which value string has most equals
                // character then add this to Autobind 
        }
Dictionary res=new Dictionary();
foreach(dicB中的var s)
{
var data=dicA.Where(x=>x.Value.Contains(s.Value)).ToList();
//检查data.count==1是否添加到自动绑定
//autoBind.Add(数据[0]。键,数据[0]。值);
//否则,请在数据中查找哪个值字符串最相等
//字符,然后将其添加到自动绑定
}
是否有其他方法(比我的代码更好)来查找所有字典数据,并将它们添加到
autobind

编辑:
dic.key
不等于
dic.key
。我想找到
dic.value
是否在
dicB.values
中,然后如果
dicB.values.count==1
添加到
newDic
中,则找到最佳匹配;哪些
dicB.值
字符串的字符最为相同

使用此代码作为示例格式

Dictionary<int, string> abc = new Dictionary<int, string>();
            foreach (var a in dicA)
            {
                foreach (var b in dicB)
                {
                    if (a.key == b.key)
                    {
                        abc.add(Convert.ToInt32(a.key, b.value);
                    }
                }
            }
Dictionary abc=newdictionary();
foreach(dicA中的var a)
{
foreach(dicB中的变量b)
{
如果(a.key==b.key)
{
abc.add(转换为32(a键,b值);
}
}
}

使用此代码作为示例格式

Dictionary<int, string> abc = new Dictionary<int, string>();
            foreach (var a in dicA)
            {
                foreach (var b in dicB)
                {
                    if (a.key == b.key)
                    {
                        abc.add(Convert.ToInt32(a.key, b.value);
                    }
                }
            }
Dictionary abc=newdictionary();
foreach(dicA中的var a)
{
foreach(dicB中的变量b)
{
如果(a.key==b.key)
{
abc.add(转换为32(a键,b值);
}
}
}
这应该可以:

var dicNew = dicB.Where(b => !dicA.ContainsValue(b.Value)).ToDictionary(x => x.Key, x => x.Value);
这应该起作用:

var dicNew = dicB.Where(b => !dicA.ContainsValue(b.Value)).ToDictionary(x => x.Key, x => x.Value);
Dictionary dicta=新字典();
Dictionary dictb=新字典();
添加(1,“Hi”);
添加(2,“你好”);
添加(2,“Hiyo”);
第B条添加(1,“Hllow”);
变量列表=(从dicta中的d1开始)
设temp=dictb.FirstOrDefault(d2=>d2.Value.Contains(d1.Value))
其中,临时值!=null
选择new{d1.Key,temp.Value}).ToDictionary(d=>d.Key,d=>d.Value);
我希望这会有所帮助。

字典dictary dicta=new Dictionary();
Dictionary dictb=新字典();
添加(1,“Hi”);
添加(2,“你好”);
添加(2,“Hiyo”);
第B条添加(1,“Hllow”);
变量列表=(从dicta中的d1开始)
设temp=dictb.FirstOrDefault(d2=>d2.Value.Contains(d1.Value))
其中,临时值!=null
选择new{d1.Key,temp.Value}).ToDictionary(d=>d.Key,d=>d.Value);

我希望这会有所帮助。

您可以使用自己的iQualityComparer以优雅的方式完成

class ValueComparer<TKey, TValue> : IEqualityComparer<KeyValuePair<TKey, TValue>>
    {
        public bool Equals(KeyValuePair<TKey, TValue> x, KeyValuePair<TKey, TValue> y)
        {
            return GetHashCode(x) == GetHashCode(y);
        }

        public int GetHashCode(KeyValuePair<TKey, TValue> obj)
        {
            return obj.Value.GetHashCode();
        }
    }
类值比较器:IEqualityComparer
{
公共布尔等于(键值对x、键值对y)
{
返回GetHashCode(x)==GetHashCode(y);
}
public int GetHashCode(KeyValuePair obj)
{
返回obj.Value.GetHashCode();
}
}
然后你可以简单地使用

var dictC = dictA.Intersect(dictB, new ValueComparer<string, string>())
var dictC=dictA.Intersect(dictB,new ValueComparer())

您可以使用自己的iQualityComparer以优雅的方式完成此任务

class ValueComparer<TKey, TValue> : IEqualityComparer<KeyValuePair<TKey, TValue>>
    {
        public bool Equals(KeyValuePair<TKey, TValue> x, KeyValuePair<TKey, TValue> y)
        {
            return GetHashCode(x) == GetHashCode(y);
        }

        public int GetHashCode(KeyValuePair<TKey, TValue> obj)
        {
            return obj.Value.GetHashCode();
        }
    }
类值比较器:IEqualityComparer
{
公共布尔等于(键值对x、键值对y)
{
返回GetHashCode(x)==GetHashCode(y);
}
public int GetHashCode(KeyValuePair obj)
{
返回obj.Value.GetHashCode();
}
}
然后你可以简单地使用

var dictC = dictA.Intersect(dictB, new ValueComparer<string, string>())
var dictC=dictA.Intersect(dictB,new ValueComparer())

a.key
不等于
b.key
。如果a.value字符串在b.values中,则添加到新词典,然后可以使用“if(a.value==b.value){abc.add(Convert.ToInt32(a.key,b.value);”进行更改'这是我为此提供的示例代码,您可以根据您的情况采取要求。
a.key
not equal
b.key
。如果a.value字符串在b.values中,则添加到新词典中,然后您可以使用'if(a.value==b.value){abc.add(Convert.ToInt32(a.key,b.value)'}这是我为此提供的一个示例代码,您可以根据您的条件接受要求。上面的代码将返回带有映射键值的dictionary对象。上面的代码将返回带有映射键值的dictionary对象。