2017-10-18 112 views
1

如何为每个不同的键添加唯一的编号?最后,我想要一个不同密钥的“集合”,但每个密钥也应该有一个值,例如,在current_index_of_collection + 1个创建一个唯一的字典并添加自动递增的整数值

elements.SelectMany(p => p.Properties.Keys).Distinct(); 

输出样本:

Key value 
a 1 
b 2 
c 3 
d 4 
+0

我猜你已经有钥匙存储在某个地方? –

+0

这些键位于每个元素的properties.keys集合中。我需要添加不断增加的整数值作为数据库id(unique/autoinc) – Elisabeth

+0

如果您想要一个唯一的自动增量数据库ID,最好使用数据库内置的自动增量机制。否则,你可能会冒险得到错误的值(特别是如果你在不同的线程或简单的多次运行代码)。 –

回答

1

您是否在寻找Select((value, index) => ...)

https://msdn.microsoft.com/en-us/library/bb534869(v=vs.110).aspx

var dictionary = elements 
    .SelectMany(p => p.Properties.Keys) 
    .Distinct() 
    .Select((key, index) => new { 
    key = key, 
    value = index + 1, 
    }) 
    .ToDictionary(item => item.key, item => item.value); 

或者

var array = elements 
    .SelectMany(p => p.Properties.Keys) 
    .Distinct() 
    .Select((key, index) => new KeyValuePair<MyKeyType, int>(key, index + 1)) 
    .ToArray(); 
+0

hm我甚至用Select的索引超载有点困惑。谢谢,我最喜欢你的解决方案,因为它包含ToDictionary()中的所有内容, – Elisabeth

1

可以使用Select超载它有一个索引字段:

string[][] elements = new string[][] { new string[] { "a", "b", "a" } }; 
var elementsWithIndex = elements.SelectMany(p => p) 
           .Distinct() 
           .Select((p, i) => new { Key = p, Value = i + 1 }); 

或者在你的代码:

var elementsWithIndex = elements.SelectMany(p => p.Properties.Keys) 
           .Distinct() 
           .Select((p, i) => new { Key = p, Value = i + 1 }); 
1

您可以简单地使用它。

List<string> keys = new List<string>(); 
    keys.Add("a"); 
    keys.Add("b"); 
    keys.Add("c"); 
    keys.Add("d"); 
    keys.Add("e"); 
    keys.Add("f"); 
    keys.Add("g"); 


var fields = keys.Distinct().Select ((t,val)=> new { Key= t, Value= (val + 1)}); 
相关问题