字典<string,uint =“”>以逗号分隔的字符串?</string,>

时间:2014-08-04 04:07:44

标签: c# asp.net linq

// 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&amp;类型。值应为uint类型。在这种情况下,字典应如下所示:

String   uint
 "324"   0
 "233"   1
 "32"    0
 "423"   1
 "23435" 0

请注意,忽略字符串中的99,因为字典中只应存在所有主数据。

有没有办法用linq做到这一点?如果没有,还有什么其他短路方式?

另外,如何使用linq或任何其他短路方法以相反的方式执行上述操作,即将dictionary<string, uint>转换回逗号分隔的字符串?此字符串应仅包含值为1的字典中的那些键。

注意:字典值只能是1或0。

非常感谢任何帮助。

3 个答案:

答案 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();

https://dotnetfiddle.net/5eU5B0