Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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# 将单个数组从索引解析为大于5个字符的2D数组_C# - Fatal编程技术网

C# 将单个数组从索引解析为大于5个字符的2D数组

C# 将单个数组从索引解析为大于5个字符的2D数组,c#,C#,我是c#新手,希望按照以下模式处理字符串: var data = new List<object> { "ABCDEFGHIJKLMNO", 80, "TestMain", "PQRSTUVWXY" }; /* - if string contains > 5 characters --> Split - check, which is the longest array from the split - us

我是c#新手,希望按照以下模式处理字符串:

var data = new List<object> { "ABCDEFGHIJKLMNO", 80, "TestMain", "PQRSTUVWXY" };

/*
- if string contains > 5 characters --> Split
- check, which is the longest array from the split
- use the longest split to be an array 2D
*/

// expected result
var new_data = new List<object[]> {
new object[] { "ABCDE",  80, "TestM", "PQRST" },
new object[] { "FGHIJ", " ", "ain", "UVWXY" },
new object[] { "KLMNO", " ",    " ",    " "  }
}
var data=新列表{“ABCDEFGHIJKLMNO”,80,“TestMain”,“PQRSTUVWXY”};
/*
-如果字符串包含>5个字符-->拆分
-选中,这是拆分后最长的数组
-使用最长的分割作为二维阵列
*/
//预期结果
var new_data=新列表{
新对象[]{“ABCDE”,80,“TestM”,“PQRST”},
新对象[]{“FGHIJ”、“ain”、“UVWXY”},
新对象[]{“KLMNO”、“”、“”、“”、“”}
}

您必须将您的
列表
约束为
列表
,因为一旦拆分,您无法确保有效转换回原始类型

var data = new List<object> { "ABCDEFGHIJKLMNO", 80, "TestMain", "PQRSTUVWXY" };
        
List<string> stringData = data.Select(o => o.ToString()).ToList();
        
const int maxCharacters = 5;
int nrOfEntries = data.Count;

List<string[]> result = new List<string[]>();
while (true)
{
    bool finished = true;

    string[] newRow = new string[nrOfEntries];
    for (int i = 0; i < nrOfEntries; i++)
    {
        string currentString = stringData[i];
        if (string.IsNullOrEmpty(currentString))
        {
            newRow[i] = " ";
            continue;
        }

        int length = currentString.Length;
        int charactersToTake = Math.Min(length, maxCharacters);
        int charactersRemaining = length - charactersToTake;

        newRow[i] = currentString.Substring(0, charactersToTake);
        switch (charactersRemaining)
        {
            case 0:
                stringData[i] = null;
                break;
            default:
                stringData[i] = currentString.Substring(charactersToTake, charactersRemaining);
                finished = false;
                break;
        }
    }
    result.Add(newRow);

    if(finished)
        break;
}
var data=新列表{“ABCDEFGHIJKLMNO”,80,“TestMain”,“PQRSTUVWXY”};
List stringData=data.Select(o=>o.ToString()).ToList();
常量int maxCharacters=5;
int nrOfEntries=data.Count;
列表结果=新列表();
while(true)
{
bool finished=true;
string[]newRow=新字符串[nrOfEntries];
对于(int i=0;i

您可以使用
列表结果
,但该列表将只包含字符串(并且仅在这样的情况下才有用),因为您无法像前面所述那样转换回任意对象。

我将使用Linq来解决此问题。(确保代码文件顶部有
using System.Linq;

首先,我们定义了一个函数,将一个对象分解为几个长度小于等于5的字符串,或者如果对象本身不是字符串,则将其分解为多个字符串

object[]分解对象(object o)
=>BreakDownObjectToEnumerable(o).ToArray();
IEnumerable细分对象到可数对象(对象o)
{
//如果对象是字符串,则返回每个部分
//具有5个字符(或少于5个,如有必要,
//(最后一个)
if(o是字符串s)
{
对于(int i=0;i
我们将子字符串与
Math.Min
结合使用。如果
length-index
小于5,则我们将其用于子字符串

如果我们在列表的所有项上使用此函数,我们将得到一个对象数组数组。这个数组可以解释为“columns”,因为第一个索引为我们提供列,第二个索引为随后的细分字符串

var data=新列表{“ABCDEFGHIJKLMNO”,80,“TestMain”,“PQRSTUVWXY”};
object[][]columns=data.Select(BreakDownObject.ToArray();
现在我们要转置数组,所以先转置行。我们编写了一个函数,它获取一个索引和数组数组,并返回带有该索引的行。(为了更容易创建数组,我再次使用Linq IEnumerable):

object[]getrowatinex(int索引,object[][]列)
=>GetRowAtIndexAsEnumerable(索引、列).ToArray();
IEnumerable GetRowatineXaseNumerable(int索引,对象[][]列)
{
foreach(列中的var列)
{
//每一列都有不同的长度,
//如果索引小于长度,则
//返回该索引处的项
如果(索引<列长度)
{
收益率返回列[指数];
}
//如果索引的长度大于或等于
//我们返回一个带有单个空格的字符串
//相反。
其他的
{
收益率回报率“;
}
}
}
此函数还使用一个空格字符串填充列中缺少的项

最后但并非最不重要的一点是,我们遍历行,直到没有列剩下项目:


列出GetAllRows(对象[][]列)
=>GetAllRowsAsEnumerable(列);
可枚举GetAllRowsAsEnumerable(对象[][]列)
{
int指数=0;
while(true)
{
//检查任何列是否有剩余项
if(!columns.Any(column=>index
将其组合为一个功能:

列表细分数据(列表数据)
{
object[][]columns=data.Select(BreakDownObject.ToArray();
返回GetAllRows(列);
}
之后,您的代码将是:

var data=新列表{“ABCDEFGHIJKLMNO”,80,“TestMain”,“PQRSTUVWXY”};
var new_data=细分数据(数据);

是的,我知道它将是一个字符串,它非常有用。非常感谢@thomas,你对
使用最长的分割作为2D数组的确切含义是什么?为什么“TestMain”会在它所在的位置被分割?…这一点没有解释…我是说使用分割得到的结果的最长长度,这只是打字错误,抱歉,为了将来的参考,我不会使用“分割”这个词来描述你在追求什么。使用分隔符打断字符串。你是。。。。