我有以下字典:
Dictionary<string, string> clauses = new Dictionary<string, string>();
这些条款是这样的:
"A|B" - "some text"
"A|D|E" - "some text"
"G" - "some text"
"E|A" - "some text"
...
我想填写下面的字典:
Dictionary<string, int> columnsBitMap = new Dictionary<string, int>();
其中string
值是第一个字典字符串的唯一letters
,int
值是通过数学公式计算的。
我有以下完美的工作:
columnsBitMap = String.Join("|", clauses.Select(clause => clause).Select(clause => clause.Key)).Split('|')
.Distinct().OrderBy(column => column)
-- can I remove the next Select ?
.Select((column, index) => new KeyValuePair<string, int>(column, index))
.ToDictionary(column => column.Key, column => Convert.ToInt32(Math.Pow(2, column.Value)));
但我想知道是否可以简化删除.Select
部分?
输出应该是这样的:
A 1
B 2
D 4
E 8
G 16
答案 0 :(得分:5)
这一点完全是多余的:
.Select(clause => clause)
只需删除它,剩下的就可以了。
我没有太多理由摆脱这部分
.Select((column, index) => new KeyValuePair<string, int>(column, index))
但如果您反对使用KeyValuePair<TKey,TValue>
,则可以将其设为匿名对象
.Select((column, index) => new{ Key = column, Value = index })
但是没有太大差异。
我以稍微不同的方式处理了您的要求:
var result = clauses.SelectMany(clause => clause.Key.Split('|'))
.Distinct().OrderBy(column => column)
.Select((column, index) => new {Key=column,Value=index})
.ToDictionary(column => column.Key, column => Convert.ToInt32(Math.Pow(2, column.Value)));
测试用例的工作示例:http://rextester.com/PWC41147