C# 高效地合并列表的列表
我需要一点帮助来开发一种算法,该算法基于类似键/值对的匹配来合并列表列表 在下面的示例中,我有3个List>实例,我希望使用merge方法调用来减少/合并它们。合并的目标是获取包含任何匹配键/值对的实例,并将两个列表合并到一个新列表中,该列表包含两个列表中的所有对。因此,在本例中,Merge方法应该将3个列表压缩为1,因为list1和list2都包含匹配的键名和“key1”和“key2”的值。然后list1和list2的新合并列表将进一步与list3合并,因为它们都包含匹配的键名和“key4”的值 有人对高效算法有什么想法吗?我目前使用的递归方法非常慢,因为它将每个列表与其他列表进行比较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”的
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实现将比您自己构建的更快。