我尝试从字典中检索特定对,并将此对转换为字符串,如下所示:
Dictionary<string, string> testDictionary= new Dictionary<string, string>();
testDictionary.Add("3123", "1");
testDictionary.Add("3523", "2");
testDictionary.Add("5532", "1");
string memberId="5532";
string finalSelectedValue = testDictionary.Where(x => x.Key == memberId).Select(y => y.Key + "_" + y.Value).ToString();
Console.WriteLine(finalSelectedValue);
但是,我不知道如何实现在字典中组合此特定对的键和值的最后一步。
预期结果为:“5532_1”
答案 0 :(得分:1)
你不需要LINQ,因为字典不能有重复的密钥。您真正需要的是 - 只需按键输入并格式化其值(字典对此任务非常有效):
string memberId = "5532";
string value;
if (testDictionary.TryGetValue(memberId, out value))
{
string finalSelectedValue = String.Format("{0}_{1}", memberId, value);
}
else
{
// member not found
}
表现不佳,但是单行:
string finalSelectedValue = testDictionary.ContainsKey(memberId) ?
$"{memberId}_{testDictionary[memberId]}" : null; // C# 6 string formatting
为什么你的方法不起作用?您正在计算所有字典条目,以查找字典中是否存在某些键(并且这是一个很大的过度杀伤力)。 Where
运算符将使用单个条目返回空集合或集合(因为字典不能具有重复的键)。之后,您将过滤结果投影到字符串集合(同样是一个或零个项目)。然后你将集合转换为字符串 - 但这将只返回集合IEnumerable<string>
的类型名称。要修复代码,您需要将ToString()
替换为FirstOrDefault()
,如果找不到条目,您将获得单个格式化字符串或null
。但是..见上文:))
答案 1 :(得分:0)
如何跳过Linq并执行此操作:
string finalSelectedValue = memberId + "_" + testDictionary[memberId];
testDictionary[memberId]
将返回字典项memberId
答案 2 :(得分:0)
试试这个。
var finalSelectedValue = testDictionary.Where(x => x.Key == memberId).Select(y => y.Key + "_" + y.Value).FirstOrDefault();
答案 3 :(得分:0)
var finalSelectedValue = string.Format("{0}_{1}", memberId, testDictionary[memberId]);
答案 4 :(得分:0)
Select
将返回IEnumerable<KeyValuePair>
。在这个IEnumerable上调用ToString不会给出你想要的结果。虽然手动查找密钥并获取值可能很简单,但如果您在此处查找linq解决方案,则需要通过使用以某种方式枚举返回的可枚举的调用来获取结果,例如{ {1}},First
,FirstOrDefault
,Single
等
你也可以做一个简单的SingleOrDefault
来做这件事。您还应该定义当密钥不存在时会发生什么。我把它留作“?”在这里,因为它没有在你的帖子中解决。
Func
然后随意使用
Func<Dictionary<string,string>,string,string> specificPair =
(d,key) => d.ContainsKey(key) ? key + "_" + d[key] : "?";