C#:使用LINQ合并关于值的两个字典

时间:2010-06-28 11:57:22

标签: c#

我在c#中有两个词典。

两个字典及其字母是

Dictionary<int,List<string>> D1 = new Dictionary<int,List<string>>();
Dictionary<int,List<string>> D2= new Dictionary<int,List<string>>();
Dictionary<int,List<string>> D3 new Dictionary<int,List<string>>();


D1[1] = new List<string>{"a","b"};
D1[2] = new List<string>{"c","d"};
D1[3] = new List<string>{"e","f"};
D1[4] = new List<string>{"h"};

其中1,2,3和4是词典D1的键

D2[1] = new List<string>{"a","b"};
D2[2] = new List<string>{"c","d"};
D2[3] = new List<string>{"e","f"};
D2[4] = new List<string>{"g"};
D2[5] = new List<string>{"b","h"};
D2[6] = new List<string>{"f","l"};
D2[7] = new List<string>{"z"};

其中1,2,3,4,5,6和7是Dictionary D2的键

然后输出字典包含此值,

  D3[1] = {"a","b","h"}
  D3[2] = {"c","d"}
  D3[3] = {"e","f","l"}

注意:     请将输入字典的值大于1.这就是为什么我要消除D1 [4],D2 [4]和D2 [7]

这是我的代码:

         List<int> l_lstTempNets = new List<int>(D1.Keys);
        int l_nCount = 0;
        for (int l_nData = 0; l_nData < l_lstTempNets.Count; l_nData++)
        {
            D3.Add(l_nCount, D1[l_lstTempNets[l_nData]]);
            l_nCount++;
        }
        l_lstTempNets = new List<int>(D2.Keys);
        for (int l_nData = 0; l_nData < l_lstTempNets.Count; l_nData++)
        {
            D3.Add(l_nCount, D2[l_lstTempNets[l_nData]]);
            l_nCount++;
        }





        List<int> l_lstOuter = new List<int>(D3.Keys);
        List<int> l_lstInner = new List<int>(D3.Keys);
        for (int l_nOuter = 0; l_nOuter < l_lstOuter.Count; l_nOuter++)
        {
            if (D3.ContainsKey(l_lstOuter[l_nOuter]) == false)
                continue;
            List<string> l_lstOuterValue = D3[l_lstOuter[l_nOuter]];
            l_lstOuterValue.Sort();
            if (l_lstOuterValue.Count == 0 || l_lstOuterValue.Count == 1)
            {
                D3.Remove(l_lstOuter[l_nOuter]);
                continue;
            }
            for (int l_nInner = 0; l_nInner < l_lstInner.Count; l_nInner++)
            {
                if (l_lstOuter[l_nOuter] != l_lstInner[l_nInner])
                {
                  if (D3.ContainsKey(l_lstInner[l_nInner]) == false)
                        continue;
                 List<string> l_lstInnerValue = new List<string>(D3[l_lstInner[l_nInner]]);
                    l_lstInnerValue.Sort();
                    for (int l_nOuterData = 0; l_nOuterData < l_lstOuterValue.Count; l_nOuterData++)
                    {
                        if (l_lstInnerValue.Contains(l_lstOuterValue[l_nOuterData]))
                        {
                            for (int l_nInnerData = 0; l_nInnerData < l_lstInnerValue.Count; l_nInnerData++)
                            {
                                if (l_lstOuterValue.Contains(l_lstInnerValue[l_nInnerData]) == false)
                                {
                                    l_lstOuterValue.Add(l_lstInnerValue[l_nInnerData]);

                                }
                            }
                            IsExists = true;
                            break;
                        }
                        else
                        {
                            IsExists = false;
                        }
                    }

                }
                else
                    IsExists = false;
                if (IsExists)
                {
                    if (D3.ContainsKey(l_lstInner[l_nInner]))
                        D3.Remove(l_lstInner[l_nInner]);
                }
            }

        }

是否可以使用LINQ 如果您有任何查询,请告诉我

1 个答案:

答案 0 :(得分:0)

根据您的要求说明,我了解您需要: 1)过滤掉值列表中少于2个值的任何字典条目。 2)匹配D2和D1中的条目,以便D2.Value中的第一项等于D1.Value中的最后一项。 3)无论与D2条目匹配,都存储到D3任何D1条目。 4)合并匹配的条目,以便每个结果Value包含来自D1.Value和D2.Value的所有项目。

似乎每个D1.Value和D2.Value中的项目代表某种分层系统,其中D1.Value中的最后一项链接到D2.Value中的第一项。

以下是我的代码:

        var f1 = D1.Where(pair => pair.Value.Count >= 2);
        var f2 = D2.Where(pair => pair.Value.Count >= 2);

        var joined = from item1 in f1
                  join item2 in f2 on item1.Value.Last() equals item2.Value.First() into DX
                  from itemX in DX.DefaultIfEmpty()
                  select new { Id = item1.Key, Value1 = item1.Value, Value2 = itemX.Value };
        foreach (var item3 in joined)
        {
            if (item3.Value2 != null)
                D3.Add(item3.Id, item3.Value1.Concat(item3.Value2.Skip(1)).ToList());
            else
                D3.Add(item3.Id, item3.Value1.ToList());
        }
f1 f2 D1 D2 的对应物,过滤后仅包含足够的条目(2+) )项目。 加入将根据解释的规则匹配所有 f1 f2 ,并生成包含 f1.Key 的匿名项目, f1.Value f2.Value 。 后续循环将添加 D3 所需的结果,检查 f2.Value null

此致 丹尼尔。