C# 高效地合并列表的列表

C# 高效地合并列表的列表,c#,algorithm,.net-4.0,C#,Algorithm,.net 4.0,我需要一点帮助来开发一种算法,该算法基于类似键/值对的匹配来合并列表列表 在下面的示例中,我有3个List>实例,我希望使用merge方法调用来减少/合并它们。合并的目标是获取包含任何匹配键/值对的实例,并将两个列表合并到一个新列表中,该列表包含两个列表中的所有对。因此,在本例中,Merge方法应该将3个列表压缩为1,因为list1和list2都包含匹配的键名和“key1”和“key2”的值。然后list1和list2的新合并列表将进一步与list3合并,因为它们都包含匹配的键名和“key4”的

我需要一点帮助来开发一种算法,该算法基于类似键/值对的匹配来合并列表列表

在下面的示例中,我有3个List>实例,我希望使用merge方法调用来减少/合并它们。合并的目标是获取包含任何匹配键/值对的实例,并将两个列表合并到一个新列表中,该列表包含两个列表中的所有对。因此,在本例中,Merge方法应该将3个列表压缩为1,因为list1和list2都包含匹配的键名和“key1”和“key2”的值。然后list1和list2的新合并列表将进一步与list3合并,因为它们都包含匹配的键名和“key4”的值

有人对高效算法有什么想法吗?我目前使用的递归方法非常慢,因为它将每个列表与其他列表进行比较

    var list1 = new List<KeyValuePair<string, string>> { 
        new KeyValuePair<string,string>("key1","2"), 
        new KeyValuePair<string,string>("key2","5"),
        new KeyValuePair<string,string>("key3","20")
    };

    var list2 = new List<KeyValuePair<string, string>> { 
        new KeyValuePair<string,string>("key1","2"), 
        new KeyValuePair<string,string>("key2","5"),
        new KeyValuePair<string,string>("key4","10"),
        new KeyValuePair<string,string>("key5","A"),
        new KeyValuePair<string,string>("key6","B"),
        new KeyValuePair<string,string>("key7","C")
    };

    var list3 = new List<KeyValuePair<string, string>> { 
        new KeyValuePair<string,string>("key10","2"), 
        new KeyValuePair<string,string>("key20","5"),
        new KeyValuePair<string,string>("key4","10"),
        new KeyValuePair<string,string>("key40","2")
    };

    var fullList = new List<IList<KeyValuePair<string, string>>>();

    fullList.Add(list1); 
    fullList.Add(list2); 
    fullList.Add(list3);

    List<IList<KeyValuePair<string, string>>> mergedList = fullList.Merge();

    /*
     output should be a single a single IList<KeyValuePair<string, string>> with a count of 10 KeyValuePair<string,string> items
     mergedList would contain the following key/value pairs

        "key1","2" 
        "key2","5"
        "key3","20"
        "key4","10"
        "key5","A"
        "key6","B"
        "key7","C"
        "key10","2" 
        "key20","5"
        "key40","2"
    */
var list1=新列表{
新的KeyValuePair(“key1”、“2”),
新的KeyValuePair(“key2”、“5”),
新的KeyValuePair(“key3”、“20”)
};
var list2=新列表{
新的KeyValuePair(“key1”、“2”),
新的KeyValuePair(“key2”、“5”),
新的KeyValuePair(“key4”、“10”),
新的KeyValuePair(“key5”,“A”),
新的KeyValuePair(“key6”、“B”),
新的KeyValuePair(“key7”、“C”)
};
var list3=新列表{
新的KeyValuePair(“key10”、“2”),
新的KeyValuePair(“key20”、“5”),
新的KeyValuePair(“key4”、“10”),
新的KeyValuePair(“key40”、“2”)
};
var fullList=新列表();
完整列表。添加(列表1);
完整列表。添加(列表2);
完整列表。添加(列表3);
List mergedList=fullList.Merge();
/*
输出应该是一个IList,计数为10个KeyValuePair项
mergedList将包含以下键/值对
“键1”、“键2”
“键2”、“键5”
“键3”、“键20”
“键4”、“键10”
“键5”、“A”
“键6”、“B”
“键7”、“C”
“键10”、“键2”
“键20”、“键5”
“键40”、“2”
*/

请参阅关于linq集合运算符的这篇文章

看起来您可以使用
字典
来存储合并的数据。这将允许您快速查找输出是否已经包含所需的键,如果没有,则添加它(对于它的值,一个包含当前项值的哈希集)。如果该键已经存在于字典中,只需获取该值(一个hashset)并调用它的Add方法,该方法已经有效地防止了重复。

听起来你想从描述中合并三个列表,而不是得到一个列表列表,例如

var list1 = new List<KeyValuePair<string, string>> { 
        new KeyValuePair<string,string>("key1","2"), 
        new KeyValuePair<string,string>("key2","5"),
        new KeyValuePair<string,string>("key3","20")
    };

var list2 = new List<KeyValuePair<string, string>> { 
        new KeyValuePair<string,string>("key1","2"), 
        new KeyValuePair<string,string>("key2","5"),
        new KeyValuePair<string,string>("key4","10"),
        new KeyValuePair<string,string>("key5","A"),
        new KeyValuePair<string,string>("key6","B"),
        new KeyValuePair<string,string>("key7","C")
    };

var list3 = new List<KeyValuePair<string, string>> { 
        new KeyValuePair<string,string>("key10","2"), 
        new KeyValuePair<string,string>("key20","5"),
        new KeyValuePair<string,string>("key4","10"),
        new KeyValuePair<string,string>("key40","2")
    };

var unionedList = new List<KeyValuePair<string, string>>();

unionedList.AddRange(list1.Union(list2).Union(list3));

foreach (var kvp in unionedList)
{
    Console.WriteLine(string.Format("{0} {1}", kvp.Key, kvp.Value));    
}
var list1=新列表{
新的KeyValuePair(“key1”、“2”),
新的KeyValuePair(“key2”、“5”),
新的KeyValuePair(“key3”、“20”)
};
var list2=新列表{
新的KeyValuePair(“key1”、“2”),
新的KeyValuePair(“key2”、“5”),
新的KeyValuePair(“key4”、“10”),
新的KeyValuePair(“key5”,“A”),
新的KeyValuePair(“key6”、“B”),
新的KeyValuePair(“key7”、“C”)
};
var list3=新列表{
新的KeyValuePair(“key10”、“2”),
新的KeyValuePair(“key20”、“5”),
新的KeyValuePair(“key4”、“10”),
新的KeyValuePair(“key40”、“2”)
};
var unionedList=新列表();
unionedList.AddRange(列表1.Union(列表2.Union)(列表3));
foreach(unionedList中的var kvp)
{
WriteLine(string.Format(“{0}{1}”,kvp.Key,kvp.Value));
}

unionedList现在将根据您的预期输出包含不同的键值对列表。如果值不同,您将得到重复的键。

您可以只使用HashSet.Union还是自己实现?对于键匹配但值不同的KVPs,您会怎么做?@Nicholas-如果kays匹配但值不同,则不应进行合并。我只希望在所有共享键在中的2个目标列表中具有相同的值时合并comparison@dotjoe-当所有相交键具有相同的值时,HashSet.Union会合并吗?哦,只需覆盖
Equals
来解释键和值……那么让HashSet进行联合应该很好。我基本上使用的是这样的实现,但它似乎非常慢。您的列表有多大?我建议,内置LINQ实现将比您自己构建的更快。