// Below is an array which contains master data
string[] masterData = { "324", "233", "32", "423", "23435" };
// Below string will always contain a comma separated subset of above master data
string abc = "233,423,99";
我需要的是拥有一个包含所有masterData数组值和字符串键的字典。将值设置为1仅适用于字符串abc中的那些键。所有其他键需要值为0.在这种情况下,字典应为string&类型。值应为uint类型。在这种情况下,字典应如下所示:
String uint
"324" 0
"233" 1
"32" 0
"423" 1
"23435" 0
请注意,忽略字符串中的99,因为字典中只应存在所有主数据。
有没有办法用linq做到这一点?如果没有,还有什么其他短路方式?
另外,如何使用linq或任何其他短路方法以相反的方式执行上述操作,即将dictionary<string, uint>
转换回逗号分隔的字符串?此字符串应仅包含值为1的字典中的那些键。
注意:字典值只能是1或0。
非常感谢任何帮助。
答案 0 :(得分:1)
var abcArray = abc.Split(',');
masterData.ToDictionary(p => p, p => (uint)(abcArray.Contains(p) ? 1 : 0));
答案 1 :(得分:1)
您可以使用Concat
将第一个数组和拆分字符串加在一起,然后使用GroupBy
对相同的数字进行分组,然后只需创建Dictionary
,重复的项目将Count
大于1.
var dict = masterData
.Concat(abc.Split(','))
.GroupBy(x => x)
.ToDictionary(k => k.Key, v => v.Count() > 1 ? 1 : 0);
要反转,请选择Value
为1且Join
刺痛的所有字符串
string result = string.Join(",", dict.Where(x => x.Value > 0)
.Select(k => k.Key)
.ToArray());
答案 2 :(得分:0)
string abc = "233,423,99";
var subset = abc.Split(',');
var result = masterData.ToDictionary(k => k, k => Convert.ToUInt32(subset.Contains(k)));
var reversedResult = result.Where(p => p.Value == 1).Select(p => p.Key).ToArray();