Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#linq合并多维字符串数组_C#_String_Linq_Multidimensional Array - Fatal编程技术网

C#linq合并多维字符串数组

C#linq合并多维字符串数组,c#,string,linq,multidimensional-array,C#,String,Linq,Multidimensional Array,我正在寻找简单的LINQ来解决这个问题: //Input string[,] arr = new string[,] { {"AA:10/BB:20/CC:30","AA:10/BB:20/CC:30","A:10/BB:20/CC:30"}, {"AA:10/BB:20/CC:30/DD:40","AA:10/BB:20/CC:30","A:10/BB:20/CC:30"}, {"AA:10/BB:20/CC:30","AA:10/BB:20/CC:30","A:10/

我正在寻找简单的LINQ来解决这个问题:

//Input
string[,] arr = new string[,]
{
    {"AA:10/BB:20/CC:30","AA:10/BB:20/CC:30","A:10/BB:20/CC:30"},
    {"AA:10/BB:20/CC:30/DD:40","AA:10/BB:20/CC:30","A:10/BB:20/CC:30"},
    {"AA:10/BB:20/CC:30","AA:10/BB:20/CC:30","A:10/BB:20/CC:30"},
};
//Expected output
string[] res = new string[]
{
    "AA:30/BB:60/CC:90/DD:40","AA:30/BB:60/CC:90","BF:30/INF:30"
};
我尝试过的解决方案

// input   
string[] breakups = new string[]
{
 "YQ:50/BF:50/YR:50",
 "YQ:50/SR:50",
 "YQ:50/BF:50/YR:50",
 "XX:10"
};
//code
string test = string.Join("/", breakups
                        .SelectMany(m => m.Split('/'))
                        .Select(x => x.Split(':'))
                        .GroupBy(m => m[0])
                        .Select(m => string.Format("{0}:{1}", m.Key, m.Sum(g => double.Parse(g[1])))));
//Output
string[] res = new string[]
 {
     "YQ:150/BF:100/YR:100/SR:50/XX:10"
 };
但如果输入是多维的,我就失败了。请引导我解决这个问题

我得到了我喜欢的答案

int columnCount = (arr.Split('@').ToArray()).Select(eac => eac.Split('|')).ToArray()[0].Length;
    var rowList = string.Join("|", from res in (arr.Split('@').ToArray()).Select(eac => eac.Split('|')).ToArray().SelectMany(x => x).Select((x, i) => new { V = x, Index = i }).
                    GroupBy(x => (x.Index + 1) % columnCount).Select(g => g.Select(x => x.V).ToList()).ToList()
                                   select string.Join("/", res
                                            .SelectMany(m => m.Split('/'))
                                            .Select(x => x.Split(':'))
                                            .GroupBy(m => m[0])
                                            .Select(m => string.Format("{0}:{1}", m.Key, m.Sum(g => double.Parse(g[1]))))));

我认为,对这一点进行总结的质疑是过分的。我永远不想在这样的东西中寻找bug;-)在这种情况下,传统的解决方案更合适:

程序
-类:

class Program
{
    static void Main(string[] args)
    {
        // Test data.
        string[,] data = new string[,]
        {
            { "AA:10/BB:20/CC:30", "AA:10/BB:20/CC:30", "A:10/BB:20/CC:30" },
            { "AA:10/BB:20/CC:30/DD:40" ,"AA:10/BB:20/CC:30", "A:10/BB:20/CC:30" },
            { "AA:10/BB:20/CC:30", "AA:10/BB:20/CC:30", "A:10/BB:20/CC:30" },
        };

        var result = SumColumns(data);
    }

    // Loops through columns and sums up the values.
    static string[] SumColumns(string[,] data)
    {
        List<Column> columns = new List<Column>();
        for (int i = 0; i < data.GetLength(0); i++)
        {
            Column column = new Column();
            for (int j = 0; j < data.GetLength(1); j++)
            {
                column.Add(data[j, i]);
            }
            columns.Add(column);
        }
        // Convert all columns back into strings.
        return columns.Select(x => x.ToString()).ToArray();
    }
}

你已经问了这个问题,并且得到了你的答案。投票以重复方式结束。这可以也将被视为垃圾邮件。如果需要多维数组,请使用循环而不是LINQ。LINQ将“展平”多维数组。对于循环,可以使用锯齿数组(
string[][]
)或
,但不能使用linq在二维数组的“行”中循环。该问题适用于一维数组。但现在我要的是覆盖物三维阵列。完全同意。LINQ解决方案看起来很复杂。
class Column
{
    Dictionary<string, int> sums = new Dictionary<string, int>();

    public void Add(string data)
    {
        // First split on '/'.
        var dataSplitted = data.Split('/');
        foreach (var item in dataSplitted)
        {
            // Second split on ':'.
            var itemSplitted = item.Split(':');
            string name = itemSplitted[0];

            // Try to get the last sum and add the current value:
            int sum = 0;
            sums.TryGetValue(name, out sum );
            sums[name] = sum + int.Parse(itemSplitted[1]);
        }
    }

    // Creates a string from the sums.
    public override string ToString()
    {
        return 
            sums
            .Select(kvp => string.Format("{0}:{1}", kvp.Key, kvp.Value))
            .Aggregate((result, next) => result + "/" + next);
    }
}