KeyValuePair列表不同

时间:2016-03-03 05:22:19

标签: c# asp.net list keyvaluepair

我有一个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”键的第三项被删除,因为它是重复的。

5 个答案:

答案 0 :(得分:2)

var dictionaryX = ListX
    .GroupBy(x => x.Key, (x, ys) => ys.First())
    .ToDictionary(x => x.Key, x => x.Value);

我不确定这是否是您正在寻找的内容,但它是一个查询,只需为每个重复键获取第一个值,即可将ListX转换为字典。

答案 1 :(得分:1)

虽然可以使用当前的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

图像:

enter image description here

如果您想要在字典中添加Key时检查<Key,Value>是否已存在,只需按ContainsKey进行检查:

if (dict.ContainsKey(key)) //the key exists

答案 2 :(得分:0)

您可以使用继承自Dictionary<TKey, TValue>的班级IEnumerable<KeyValuePair<TKey, TValue>>。它是KeyValuePairs的集合,它只允许使用唯一键。

答案 3 :(得分:0)

你可以使用

Dictionary<TKey, TValue>   

其中Tkey和Tvalue是通用数据类型。

例如,它们可以是int,string,另一个字典等。

示例Dictionary<int , string>, Dictionary<int , List<employee>>等。

在所有这些情况下,键是不同的部分,即不能再次插入相同的键。

你可以使用区别检查密钥是否存在,这样即使你尝试添加相同的密钥也不会发生异常

然而 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)

答案 4 :(得分:0)

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);
}

检查是否有效