var a1 = new List<KeyValuePair<TKey, TValue>>();
var a2 = new List<KeyValuePair<TKey, TValue>>();
我有以上两个键值对列表。我想在删除重复项时将它们组合在一起。我很确定我可以通过使用LINQ来做到这一点,但我看到的示例并没有直接适用,因为它们没有指定从List<KeyValuePair<TKey, TValue>>
到List<KeyValuePair<TKey, TValue>>
的完整过程。如果两个列表包含相同的键,它们也将具有相同的值,因此合并时保留哪个列并不重要。
答案 0 :(得分:1)
你是对的,你可以在Linq做到这一点。但是,您必须要小心如何在TValue
上实现相等性(当然,您必须小心TKey
,但是您说这些是字符串,所以相等是明确定义的)。
void Main()
{
var a1 = new List<KeyValuePair<string, int>>();
var a2 = new List<KeyValuePair<string, int>>();
a1.Add(new KeyValuePair<string, int>("A", 1));
a1.Add(new KeyValuePair<string, int>("B", 2));
a1.Add(new KeyValuePair<string, int>("C", 3));
a1.Add(new KeyValuePair<string, int>("D", 4));
a2.Add(new KeyValuePair<string, int>("B", 2));
a2.Add(new KeyValuePair<string, int>("E", 5));
a2.Add(new KeyValuePair<string, int>("C", 33));
var distinct = a1.Union(a2).Distinct();
foreach(var kv in distinct)
{
Console.WriteLine($"{kv.Key}={kv.Value}");
}
}
这将打印以下结果:
A=1
B=2
C=3
D=4
E=5
C=33
答案 1 :(得分:1)
如果(如上所述)你不介意选择哪一个重复,那么:
var result = a1.Concat(a2)
.GroupBy(x => x.Key)
.Select(g => g.First())
.ToList();
或者,如果您有很多项目,更好的方法是使用(更高效)DistinctBy
实施。这个(或多或少)来自MoreLinq。
public static class LinqEx
{
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer = null)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
return _(); IEnumerable<TSource> _()
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
}
}
}
然后
var result = a1.Concat(a2)
.DistinctBy(x => x.Key)
.ToList();
答案 2 :(得分:0)
假设&#34;两个列表包含相同的键,它们也将具有相同的值&#34;你可以这样做:
var a3 = new List<KeyValuePair<TKey, TValue>>();
a3.AddRange(a1);
a3.AddRange(a2);
var a3 = a3.Distinct().ToList();
或:
var a3 = a1.Union(a2).ToList();
答案 3 :(得分:0)
如果您创建一个字典并迭代两个列表并将它们添加到字典中,该怎么办?字典不能有相同的密钥,因此在尝试添加时请使用try catch。
Dictionary<TKey,TValue> myDictionary = new Dictionary();
//Iterate over list
//add try catch to attempt to add key and value to the dictionary.