C# 使用linq将字符串转换为三维数组

C# 使用linq将字符串转换为三维数组,c#,linq,C#,Linq,我看到了一些示例,并实现了linq以将分隔字符串转换为2D数组,如下所示: 使用系统; 使用System.Linq; 命名空间AACOBusinessModel.Extensions { [可序列化] 公共类二维Tringarray { 公共二维字符串数组(字符串数据) { // 1;2;3^^4;5;6 此参数。数据=( 从字符串行开始 在data.Split中(新字符串[]{“^^”},StringSplitOptions.RemoveEmptyEntries) 选择line.Split(“

我看到了一些示例,并实现了linq以将分隔字符串转换为2D数组,如下所示:

使用系统;
使用System.Linq;
命名空间AACOBusinessModel.Extensions
{
[可序列化]
公共类二维Tringarray
{
公共二维字符串数组(字符串数据)
{
// 1;2;3^^4;5;6
此参数。数据=(
从字符串行开始
在data.Split中(新字符串[]{“^^”},StringSplitOptions.RemoveEmptyEntries)
选择line.Split(“;”)
).ToArray();
}
公共二维stringarray(){}
公共只读字符串[][]数据={};
公共重写字符串ToString()
{
返回字符串。Join(“^^”,
从字符串[]行
在数据中
选择字符串。连接(“;”,第行)
);
}
}
}
当我试图在3D中实现这一点时,我遇到了一个问题:

使用系统;
使用System.Linq;
命名空间AACOBusinessModel.Extensions
{
[可序列化]
公共类三维三角网格
{
公共三维字符串数组(字符串数据)
{
// 1;2;3^^4;5;6@4;4;4^^7;7;7
此参数。数据=(
从字符串line2D
在data.Split中(新字符串[]{“@”},StringSplitOptions.RemoveEmptyEntries)
从字符串行开始
在line2D.Split中(新字符串[]{“^^”},StringSplitOptions.RemoveEmptyEntries)
选择line.Split(“;”)
);
}
公共三维字符串({}
公共只读字符串[][]数据={};
公共重写字符串ToString()
{
返回字符串。Join(“@”,
从字符串[][]line2D
在数据中
选择string.Join(“^^”,
从字符串[]行
在线2D
选择字符串。连接(“;”,第行)
)
);
}
}
}
据我所知,在2D中,结束选择是一个拆分集合,转换为数组,从而形成2D数组

但对于3D,结束选择需要选择一组2D阵列。我不知道怎么做

更新

我想到了这个,但是如果可能的话,我想要查询语法

public三维字符串数组(字符串数据)
{
此参数。数据=(
从字符串line2D
在data.Split中(新字符串[]{“@”},StringSplitOptions.RemoveEmptyEntries)
挑选(
从字符串行开始
在line2D.Split中(新字符串[]{“^^”},StringSplitOptions.RemoveEmptyEntries)
选择line.Split(“;”)
).ToArray()
).ToArray();
}

不确定如何在查询语法中执行此操作,但以下是方法语法版本:

this.Data = data
    .Split(new[] { "@" }, StringSplitOptions.RemoveEmptyEntries)
    .Select(table => table.Split(new[] { "^^" }, StringSplitOptions.RemoveEmptyEntries)
        .Select(row => row.Split(';'))
        .ToArray())
    .ToArray();

在查询synax中:

this.Data = (
    from table in data.Split(new[] { "@" }, StringSplitOptions.RemoveEmptyEntries)
    select
    (
        from row in table.Split(new[] { "^^" }, StringSplitOptions.RemoveEmptyEntries)
        select row.Split(';')
    ).ToArray()
).ToArray();

不确定如何在查询语法中执行此操作,但以下是方法语法版本:

this.Data = data
    .Split(new[] { "@" }, StringSplitOptions.RemoveEmptyEntries)
    .Select(table => table.Split(new[] { "^^" }, StringSplitOptions.RemoveEmptyEntries)
        .Select(row => row.Split(';'))
        .ToArray())
    .ToArray();

在查询synax中:

this.Data = (
    from table in data.Split(new[] { "@" }, StringSplitOptions.RemoveEmptyEntries)
    select
    (
        from row in table.Split(new[] { "^^" }, StringSplitOptions.RemoveEmptyEntries)
        select row.Split(';')
    ).ToArray()
).ToArray();

您需要一个嵌套的
select
子句来返回嵌套集合

制作一个列表,然后转换成一个数组对你来说很有用

this.Data = (
    from string line2D
    in data.Split(new string[] { "@" }, StringSplitOptions.RemoveEmptyEntries)
    select new List<string>(    
      from string line
      in line2D.Split(new string[] { "^^" }, StringSplitOptions.RemoveEmptyEntries)
      select line.Split(';')).ToArray());
this.Data=(
从字符串line2D
在data.Split中(新字符串[]{“@”},StringSplitOptions.RemoveEmptyEntries)
选择新列表(
从字符串行开始
在line2D.Split中(新字符串[]{“^^”},StringSplitOptions.RemoveEmptyEntries)
选择line.Split(“;”).ToArray();

您需要一个嵌套的
select
子句来返回嵌套集合

制作一个列表,然后转换成一个数组对你来说很有用

this.Data = (
    from string line2D
    in data.Split(new string[] { "@" }, StringSplitOptions.RemoveEmptyEntries)
    select new List<string>(    
      from string line
      in line2D.Split(new string[] { "^^" }, StringSplitOptions.RemoveEmptyEntries)
      select line.Split(';')).ToArray());
this.Data=(
从字符串line2D
在data.Split中(新字符串[]{“@”},StringSplitOptions.RemoveEmptyEntries)
选择新列表(
从字符串行开始
在line2D.Split中(新字符串[]{“^^”},StringSplitOptions.RemoveEmptyEntries)
选择line.Split(“;”).ToArray();

我通常会在.NET项目中使用大致相同的通用扩展:

public static string[] splitR(this string str, params string[] separators) {
    return str.Split(separators, StringSplitOptions.RemoveEmptyEntries); }

public static O[] convert<I, O>(this I[] array, Converter<I, O> converter) {
    return Array.ConvertAll(array, converter); }

public static string joinT<T>(this T[] values, string separator) {
    return string.Join(separator, values); }

在.NET项目中,我通常会使用大致相同的通用扩展:

public static string[] splitR(this string str, params string[] separators) {
    return str.Split(separators, StringSplitOptions.RemoveEmptyEntries); }

public static O[] convert<I, O>(this I[] array, Converter<I, O> converter) {
    return Array.ConvertAll(array, converter); }

public static string joinT<T>(this T[] values, string separator) {
    return string.Join(separator, values); }

你是b;A.d^^a;ss@t;HA.Nk^^y;o;你是一个b;A.d^^a;ss@t;HA.Nk^^y;o;u您已删除第二个
.ToArray()
调用。很好。仍然没有从内部编译
。“无法从'System.Collections.Generic.IEnumerable'转换为'int'”。您已放弃第二个
.ToArray()
调用。很好。仍然没有从内部编译
。“无法从'System.Collections.Generic.IEnumerable'转换为'int'”你在Vulcan的学院教书吗?这简直是天方夜谭。我得边喝咖啡边研究这个问题。就像一艘宇宙飞船刚刚降落在我的后院。看起来你几乎可以利用它来创建一个NDimensionalStringArray类,该类在构造函数中采用维度。我的坏习惯是尽量少放几行代码,这样我就可以用更少的滚动来查看更多的代码:]我在想某种通用递归函数来处理可变数量的分隔符,但我分心了,几分钟后就放弃了。我只是希望你的值中没有一个包含这3个分隔符中的任何一个,因为这会有点麻烦。你在Vulcan的学院教书吗?这简直是天方夜谭。我得边喝咖啡边研究这个问题。就像一艘宇宙飞船刚刚降落在我的后院。看起来你几乎可以利用它来创建一个NDimensionalStringArray类,该类在构造函数中采用维度。我的坏习惯是尽量少放几行代码,这样我就可以用更少的滚动来查看更多的代码:]我在想某种通用递归函数来处理可变数量的分隔符,但我分心了,几分钟后就放弃了。我只希望您的值中没有一个包含这3个分隔符中的任何一个,因为这会有点麻烦。