Foreach,而值与先前值相同

时间:2014-02-27 14:20:15

标签: c# linq

我发现很难解释这个问题,但我认为这是我们很多人遇到的常见问题。

假设我有以下格式的List<string, string>

1, value-
1, and value-
1, again value-
2, another value-
2, yet another value-

我想将其转换为List<string>,其中只包含2个项目

value-and value-again value-
another value-yet another value

这是基于数字(1或2)。

我通常使用的代码有效,但似乎有些繁琐。

是否有更简洁的方式,可能是Linq?

一个快速的控制台应用程序来演示我正在尝试做什么,希望能比我的问题更好地解释它!

class Program
{
    static void Main(string[] args)
    {
        List<Tuple<string, string>> myTuple = new List<Tuple<string, string>>();
        myTuple.Add(new Tuple<string, string>("1", "value-"));
        myTuple.Add(new Tuple<string, string>("1", "and value-"));
        myTuple.Add(new Tuple<string, string>("1", "again value-"));
        myTuple.Add(new Tuple<string, string>("2", "another value-"));
        myTuple.Add(new Tuple<string, string>("2", "yet another value"));

        string previousValue = "";
        string concatString = "";
        List<string> result = new List<string>();
        foreach (var item in myTuple)
        {
            if (string.IsNullOrEmpty(previousValue)) 
                previousValue += item.Item1;

            if (previousValue == item.Item1)
                concatString += item.Item2;
            else
            {
                result.Add(concatString);
                concatString = "";
                previousValue = item.Item1;
                concatString=item.Item2;
            }
        }
        //add the last value
        result.Add(concatString);
    }

1 个答案:

答案 0 :(得分:7)

List<string> result = myTuple.GroupBy(t => t.Item1)
                     .Select(g => String.Join(" ", g.Select(tp=>tp.Item2)))
                     .ToList();