在两个字符串字典之间找到字符串不等于; LINQ

时间:2016-11-01 05:24:45

标签: c# linq dictionary

我有两本字典

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

dicA.Values可能等于dicB.Values,但大部分时间dicB.Values包含dicA.Values

问题: 我想在dicB中找到包含dicA.Values的所有值,并添加到新词典dicNewdicNew.Key=dicA.keydicNew.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 
        }

还有其他方法(比我的代码更好)查找所有字典数据都可以匹配并将它们添加到autobind吗?

编辑: dicA.key不等于dicB.key。我想查找dicA.value是否在dicB.values,然后如果dicB.values.count==1添加到newDic,则查找最佳匹配;哪个dicB.Values字符串具有最相同的字符

5 个答案:

答案 0 :(得分:1)

将此代码用作样本格式

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);
                    }
                }
            }

答案 1 :(得分:1)

var dictoinaryResult = dictionaryB.Where(x => dictionaryA.ContainsValue(x.Value)).ToDictionary(x=> x.Key, x=>x.Value);

答案 2 :(得分:0)

这应该有效:

var dicNew = dicB.Where(b => !dicA.ContainsValue(b.Value)).ToDictionary(x => x.Key, x => x.Value);

答案 3 :(得分:0)

   Dictionary<int,string> dicta = new Dictionary<int, string>();
        Dictionary<int, string> dictb = new Dictionary<int, string>();

        dicta.Add(1, "Hi");
        dicta.Add(2, "Hello");
        dictb.Add(2, "Hiyo");
        dictb.Add(1, "Hllow");

        var list = (from d1 in dicta
                   let temp = dictb.FirstOrDefault(d2 => d2.Value.Contains(d1.Value))
                   where temp.Value != null
                   select new { d1.Key, temp.Value }).ToDictionary(d => d.Key ,d => d.Value );

我希望这会有所帮助。

答案 4 :(得分:0)

您可以使用自己的IEqualityComparer

以优雅的方式完成
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();
        }
    }

然后你可以简单地使用

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