要区分的 KeyValuePair 列表
List of KeyValuePair to be Distinct
我有一个 KeyValuePair 列表,它的值也是列表,例如
List<KeyValuePair<string, List<string>>> ListX = new List<KeyValuePair<string,List<string>>>();
ListX.Add(new KeyValuePair<string,List<string>>("a",list1));
ListX.Add(new KeyValuePair<string,List<string>>("b",list1));
ListX.Add(new KeyValuePair<string,List<string>>("a",list1));`
我希望列表中每个KeyValuePair的键不重复,只有键,我可以在这个列表中使用Distinct吗?
例如,我希望删除列表中具有 "a" 键的第三项,因为它是重复的。
您可以使用继承自 IEnumerable<KeyValuePair<TKey, TValue>>
的 class Dictionary<TKey, TValue>
。它是 KeyValuePairs 的集合,只允许唯一键。
你可以使用
Dictionary<TKey, TValue>
其中 Tkey 和 Tvalue 是通用数据类型。
例如,它们可以是 int、string、另一个字典等
例子Dictionary<int , string>, Dictionary<int , List<employee>>
等
在所有这些情况下,密钥是不同的部分,即无法再次插入相同的密钥。
您可以使用 Distinct 检查密钥是否存在,这样即使您尝试添加相同的密钥也不会发生异常
但是 Distinct 仅防止相同的键值对 .
要防止添加相同的密钥 使用Enumerable.GroupBy
ListItems.Select(item =>
{
long value;
bool parseSuccess = long.TryParse(item.Key, out value);
return new { Key = value, parseSuccess, item.Value };
})
.Where(parsed => parsed.parseSuccess)
.GroupBy(o => o.Key)
.ToDictionary(e => e.Key, e => e.First().Value)
虽然可以使用您当前的 List
使其具有 Distinct
键,但我认为适合您的情况的最简单的解决方案是使用 Dictionary<string,List<string>>
它完全满足您的需求:
Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();
dict.Add("a", new List<string>());
dict.Add("b", new List<string>());
dict.Add("a", new List<string>()); //will throw an error
图片:
如果要在字典中添加 <Key,Value>
时需要检查 Key
是否已经存在,只需检查 ContainsKey
:
if (dict.ContainsKey(key)) //the key exists
List<Dictionary<int, List<int>>> list = new List<Dictionary<int, List<int>>>(); //List with a dictinary that contains a list
int key = Convert.ToInt32(Console.ReadLine()); // Key that you want to check if it exist in the dictinary
int temp_counter = 0;
foreach(Dictionary<Int32,List<int>> dict in list)
{
if(dict.ContainsKey(key))
temp_counter+=temp_counter;
}
if (temp_counter == 0) // key not present in dictinary then add a to the list a dictinary object that contains your list
{
Dictionary<int,List<int>> a = new Dictionary<int,List<int>>();
a.Add(key,new List<int>()); // will contain your list
list.Add(a);
}
检查这是否有效
var dictionaryX = ListX
.GroupBy(x => x.Key, (x, ys) => ys.First())
.ToDictionary(x => x.Key, x => x.Value);
我不确定这是否是您要查找的内容,但它是一个查询,它将通过仅获取每个重复键的第一个值将 ListX
转换为字典。
我有一个 KeyValuePair 列表,它的值也是列表,例如
List<KeyValuePair<string, List<string>>> ListX = new List<KeyValuePair<string,List<string>>>();
ListX.Add(new KeyValuePair<string,List<string>>("a",list1));
ListX.Add(new KeyValuePair<string,List<string>>("b",list1));
ListX.Add(new KeyValuePair<string,List<string>>("a",list1));`
我希望列表中每个KeyValuePair的键不重复,只有键,我可以在这个列表中使用Distinct吗?
例如,我希望删除列表中具有 "a" 键的第三项,因为它是重复的。
您可以使用继承自 IEnumerable<KeyValuePair<TKey, TValue>>
的 class Dictionary<TKey, TValue>
。它是 KeyValuePairs 的集合,只允许唯一键。
你可以使用
Dictionary<TKey, TValue>
其中 Tkey 和 Tvalue 是通用数据类型。
例如,它们可以是 int、string、另一个字典等
例子Dictionary<int , string>, Dictionary<int , List<employee>>
等
在所有这些情况下,密钥是不同的部分,即无法再次插入相同的密钥。
您可以使用 Distinct 检查密钥是否存在,这样即使您尝试添加相同的密钥也不会发生异常
但是 Distinct 仅防止相同的键值对 .
要防止添加相同的密钥 使用Enumerable.GroupBy
ListItems.Select(item =>
{
long value;
bool parseSuccess = long.TryParse(item.Key, out value);
return new { Key = value, parseSuccess, item.Value };
})
.Where(parsed => parsed.parseSuccess)
.GroupBy(o => o.Key)
.ToDictionary(e => e.Key, e => e.First().Value)
虽然可以使用您当前的 List
使其具有 Distinct
键,但我认为适合您的情况的最简单的解决方案是使用 Dictionary<string,List<string>>
它完全满足您的需求:
Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();
dict.Add("a", new List<string>());
dict.Add("b", new List<string>());
dict.Add("a", new List<string>()); //will throw an error
图片:
如果要在字典中添加 <Key,Value>
时需要检查 Key
是否已经存在,只需检查 ContainsKey
:
if (dict.ContainsKey(key)) //the key exists
List<Dictionary<int, List<int>>> list = new List<Dictionary<int, List<int>>>(); //List with a dictinary that contains a list
int key = Convert.ToInt32(Console.ReadLine()); // Key that you want to check if it exist in the dictinary
int temp_counter = 0;
foreach(Dictionary<Int32,List<int>> dict in list)
{
if(dict.ContainsKey(key))
temp_counter+=temp_counter;
}
if (temp_counter == 0) // key not present in dictinary then add a to the list a dictinary object that contains your list
{
Dictionary<int,List<int>> a = new Dictionary<int,List<int>>();
a.Add(key,new List<int>()); // will contain your list
list.Add(a);
}
检查这是否有效
var dictionaryX = ListX
.GroupBy(x => x.Key, (x, ys) => ys.First())
.ToDictionary(x => x.Key, x => x.Value);
我不确定这是否是您要查找的内容,但它是一个查询,它将通过仅获取每个重复键的第一个值将 ListX
转换为字典。