2014-11-14 39 views
0

我想连接字典中的值,如果密钥已经存在。但我该怎么做。如何在字典中连接字符串如果密钥已经存在

public class Test(SomeModel data) 
{ 
    var sample = new Dictionary<int, string>(); 
    data.SomeProperty.ForEach(f => sample.Add(f.Id, f.Text)); 
} 

我在尝试添加文本时出现错误。因为我有同样的钥匙。当找到相同的密钥添加文本。怎么做。 感谢

+0

查找'string.Join()'方法可以帮助您 – MethodMan

+0

您能否澄清一下您的问题?你需要知道如何检查字典是否包含密钥?你需要学习如何使用'if'来检查条件吗?你正在研究如何连接字符串?在编写与您相匹配的代码时遇到问题有点难。 –

回答

4

您可以使用LINQ GroupBy方法:基于Id

var sample = data.SomeProperty 
     .GroupBy(x => x.Id) 
     .ToDictionary(g => g.Key, x => string.Join(",", g.Select(x => x.Text))); 

这将组项目,它会创建一个字典,其中KeyIdValueId对应的文本值以逗号分隔格式连接。

0

我个人喜欢LINQ方法(即其他答案),只是因为它看起来更简洁和可读。但我提供这个作为替代方案,我认为至少要意识到这一点很重要。

如果由于某种原因,你处于不适合你的情况(很明显,在你的原始示例中,LINQ方法应该可以工作),你可以更明确地做到这一点。作为额外的奖励,这可能是(不是一定)会更有效(*):

var sample = new Dictionary<int, string>(); 

data.SomeProperty.ForEach(f => 
{ 
    string newText = f.Text, oldText; 

    if (sample.TryGetValue(f.Id, out oldText)) 
    { 
     newText = oldText + newText; 
    } 

    sample[f.Id] = newText; 
}); 

在任何情况下,恕我直言,这是一件好事,知道该怎么做这样的事情明确,如“按键汇总“情况相当普遍,LINQ并不总是最方便的方法,因为缺乏其他类型序列的聚合器。

从技术上讲,你实际上并不需要从呼叫TryGetValue()检查返回的结果,因为在string类型的默认值是null并与另一string例如串联null是合法的,其中null为空字符串处理。但我喜欢这样做的明确性,在任何情况下,当密钥不存在时,它都会保存方法调用。 (*)LINQ很方便,但这样做的代价是...在这里,虽然string.Join()可能比字符串连接更好,但是您有分组操作的开销。哪一个支配成本取决于原始数据......如果每个键的字符串相对较少,则连接可能会更好,但如果您有大量字符串,则所有这些连接和临时字符串的开销可以很容易超过分组操作的开销。

相关问题