使用没有外部变量的LINQ从字典(值)中Concat所有字符串

时间:2018-01-31 09:57:22

标签: c# linq dictionary concat

使用词典,其中键可以是任何内容(例如int),值是我想要输出的一些文本。

Dictionary<int, string> dict = new Dictionary<int, string>();

dict.Add(1, "This is the first line.");
dict.Add(2, "This is the second line.");
dict.Add(3, "This is the third line.");

获得输出:

string lResult = dict. ... //there should go the LINQ query
Console.WriteLine(lResult);

输出:

This is the first line.
This is the second line.
This is the third line.

问:是否可以连接Dictionary中的行,将它们作为一个字符串而不使用外部变量?

我尝试使用一些Select/SelectMany/Zip解决方案,但我无法想象如何在不使用外部变量的情况下将1 LINQ调用的值传递给其他人。

另一个想法是Select值,将它们放入List然后连接(再次使用外部变量)。像:

string tmp = "";
dict.Select(a => a.Value).ToList().ForEach(b => tmp += b);

4 个答案:

答案 0 :(得分:11)

你不应该使用LINQ连接字符串。这可以成为very expenisve。使用string.Join() innstead:

string result = string.Join(Environment.NewLine, dict.Values);

但是,这并不能保证正确的顺序,因为Dictionary<>没有排序。要按Key对输出进行排序,您可以执行以下操作:

string sorted = string.Join(Environment.NewLine, 
                     dict.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Value));

答案 1 :(得分:2)

你可以这样做:

string.Join(Environment.NewLine, dict.Values)

但请注意,the documentation表示将以未指定的顺序检索值。

答案 2 :(得分:2)

如果你想使用LINQ,我建议使用StringBuilder。否则表现会受到太大影响:

string lResult = dict.Values.Aggregate(new StringBuilder(), (a, b) => a.Append(b)).ToString()

答案 3 :(得分:1)

循环中附加string

ForEach(b => tmp += b)

反模式;你应该使用StringBuilder。如果您必须使用 Linq(而不是专为此设计的string.Join):

  dict.Add(1, "This is the first line.");
  dict.Add(2, "This is the second line.");
  dict.Add(3, "This is the third line.");

  string result = dict
    .OrderBy(pair => pair.Key)
    .Aggregate((StringBuilder) null, 
               (sb, pair) => (sb == null 
                  ? new StringBuilder() 
                  : sb.Append(Environment.NewLine)).Append(pair.Value))
    .ToString();