C# 有问题。换句话说,在将这些数据作为字符串转储之前对其进行排序。列的宽度是否固定?这些列是否总是由一个或多个空格分隔?列是否会包含空格?是否要按ASCII顺序(例如1,10,11,12…2,3等)或数字顺序(1,2,3…9,10,11)对第六列进行排序?有效
C# 有问题。换句话说,在将这些数据作为字符串转储之前对其进行排序。列的宽度是否固定?这些列是否总是由一个或多个空格分隔?列是否会包含空格?是否要按ASCII顺序(例如1,10,11,12…2,3等)或数字顺序(1,2,3…9,10,11)对第六列进行排序?有效,c#,string,sorting,richtextbox,C#,String,Sorting,Richtextbox,有问题。换句话说,在将这些数据作为字符串转储之前对其进行排序。列的宽度是否固定?这些列是否总是由一个或多个空格分隔?列是否会包含空格?是否要按ASCII顺序(例如1,10,11,12…2,3等)或数字顺序(1,2,3…9,10,11)对第六列进行排序?有效位数小于4的值是否有前导零?是否忽略第六列中的所有非数字字符?如果是这样的话,为什么以DDDD为特征的产品线出现在它所在的位置?我认为这里需要更多的细节,因为有很多不明确的地方@马特·格里尔:不幸的是,它是这样给我的。这就是为什么我不知道该怎么
有问题。换句话说,在将这些数据作为字符串转储之前对其进行排序。列的宽度是否固定?这些列是否总是由一个或多个空格分隔?列是否会包含空格?是否要按ASCII顺序(例如1,10,11,12…2,3等)或数字顺序(1,2,3…9,10,11)对第六列进行排序?有效位数小于4的值是否有前导零?是否忽略第六列中的所有非数字字符?如果是这样的话,为什么以DDDD为特征的产品线出现在它所在的位置?我认为这里需要更多的细节,因为有很多不明确的地方@马特·格里尔:不幸的是,它是这样给我的。这就是为什么我不知道该怎么处理它(@Bryan:这些列的宽度不是固定的。这些列由多个空格分隔。这些列不应该包含空格。第6列应该按照上述给定的要求进行排序。但是,第2列应该按照数字/字母顺序进行排序。不,小于4个有效数字的数字不需要前导零。不,t它们不会被忽略——需要搜索并检查包含
ABC1111
的行,以查看其中是否有任何值。如果它找到了值(在本例中为“1111”),则将其读取为该值。还有其他问题吗?:)你所说的“ABC1111”没有排序是什么意思?所有的主角都无关紧要吗?为什么DDDD
在2222和4444之间排序?好的,我使用的是string[]sortedOneRichTextBox=onerichtTextBox.Text.Split('\n')
将文本拆分为单独的对象,但我考虑的更多的是拆分每个对象的单独属性。i、 e.myObject.Field1=myString.SubString(0,6.Trim();myObject.Field2=myString.SubString(6,11.Trim()代码>等。我不熟悉子字符串。你能给我举个更具体的例子吗?另外,如果我使用String.split
拆分文本,我可以按照sortedOneRichTextBox[5]值对它们进行排序吗?然后通过sortedOneRichTextBox[1]值?如果是这样,我该怎么做呢?好的,我使用的是string[]sortedOneRichTextBox=onerichtTextBox.Text.Split('\n')
将文本拆分为单独的对象,但我考虑的更多的是拆分每个对象的单独属性。i、 e.myObject.Field1=myString.SubString(0,6.Trim();myObject.Field2=myString.SubString(6,11.Trim()代码>等。我不熟悉子字符串。你能给我举个更具体的例子吗?另外,如果我使用String.split
拆分文本,我可以按照sortedOneRichTextBox[5]值对它们进行排序吗?然后通过sortedOneRichTextBox[1]值?如果是这样,我该怎么做呢?如果我有更多的案例需要分类:比如说3333
,5555
,6666
,7777
。。等我是否会创建更多的if
语句,并使用正确的return
值将它们按正确的顺序排列?此外,行var bSignifier=getsengier(b托克[5])上的索引超出范围也有错误代码>那么,只有几个案例需要分类吗?因为这就是我最初读你的问题的方式。如果这是一个普遍的规则,那么我会写得有点不同。一般规则是什么?如果有数字,则按数字排序;如果没有数字,则按字母排序?是的,如果文本结尾出现空行等意外情况,则会出现超出范围的错误。正如评论所说,我在签出时留下了很多错误。实际上,我有一个更大规模的排序情况。。以下是我试图整理的顺序:RES、0402、0201、0603、0805、1206、1306、1608、3216、2551、1913、1313、2513、5125、2525、5619、3813、1508、6431、2512、1505、2208、1005、1010、2010、0505、0705、1020、1812、2225、5764、4532、1210、0816、0363、SOT
如果我还有更多的病例需要分类:比如3333
,5555
,6666
,7777
。。等我是否会创建更多的if
语句,并使用正确的return
值将它们按正确的顺序排列?此外,行var bSignifier=getsengier(b托克[5])上的索引超出范围也有错误代码>那么,只有几个案例需要分类吗?因为这就是我最初读你的问题的方式。如果这是一个普遍的规则,那么我会写得有点不同。一般规则是什么?如果有数字,则按数字排序;如果没有数字,则按字母排序?是的,如果文本结尾出现空行等意外情况,则会出现超出范围的错误。正如评论所说,我在签出时留下了很多错误。实际上,我有一个更大规模的排序情况。。以下是我试图得到的顺序:RES,0402,0201,0603,0805,1206,1306,1608,3216,2551,1913,1313,2513,5125,2525,5619,3813,1508,6431,2512,1505,2208,1005,1010,2010,0505,0705,1020,1812,2225,5764,4532,1210,0816,0363,SOT
TEXT TEXT-1 227.905 174.994 180 1111
TEXT DIFTEXT 227.905 203.244 180 9999
TEXT DIFTEXT2 242.210 181.294 180 2222
TEXT TEXT-2 236.135 198.644 90 ABC1111
TEXT SOMETEXT 250.610 201.594 0 DDDD
TEXT OTHERTEXT 269.665 179.894 180 4444
TEXT OTHERTEXT 269.665 198.144 180 1111
TEXT OTHERTEXT 269.665 179.894 180 1111
TEXT TEXT-1 227.905 174.994 180 1111
TEXT TEXT-2 236.135 198.644 90 ABC1111 #See note above
TEXT DIFTEXT2 242.210 181.294 180 2222
TEXT OTHERTEXT 269.665 198.144 180 4444
TEXT DIFTEXT 227.905 203.244 180 9999
TEXT SOMETEXT 250.610 201.594 0 DDDD
private static void SortRichTextBox(RichTextBox richTextBox)
{
var lineArray = richTextBox.Lines;
Array.Sort(lineArray, delegate(string a, string b)
{
// I omitted Important corner cases like malformed lines,
// empty strings, and nulls.
// Additional sort cases can be added to the array as needed.
var sortOrder = new[] { "1111", "2222", "4444", "9999", "DDDD" };
var aTokens = a.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var bTokens = b.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var aSignifier = Array.FindIndex(sortOrder, item => aTokens[5].Contains(item));
var bSignifier = Array.FindIndex(sortOrder, item => bTokens[5].Contains(item));
// This is where your first rule is being implemented, based on the data
// from the last column. The math is unimportant, what matters is the
// return being positive vs. negative vs. zero.
if (aSignifier != bSignifier)
return aSignifier - bSignifier;
// This is where your second rule is being implemented, as a backup when
// the result from the first rule indicates equality. We're just falling
// through to ordinary string comparison on the second column.
return aTokens[1].CompareTo(bTokens[1]);
});
// We want to call the setter to get the textbox to update.
richTextBox.Lines = lineArray;
}
static void Main(string[] args)
{
string input =
"TEXT TEXT-1 227.905 174.994 180 1111\n" +
"TEXT DIFTEXT 227.905 203.244 180 9999\n" +
"TEXT DIFTEXT2 242.210 181.294 180 2222\n" +
"TEXT TEXT-2 236.135 198.644 90 ABC1111\n" +
"TEXT SOMETEXT 250.610 201.594 0 DDDD\n" +
"TEXT OTHERTEXT 269.665 179.894 180 4444\n" +
"TEXT OTHERTEXT 269.665 198.144 180 1111";
string[] lines = input.Split('\n');
string[][] grid = new string[lines.Length][];
for (int i = 0; i < lines.Length; i++)
{
grid[i] = lines[i].Split((char[])null, StringSplitOptions.RemoveEmptyEntries); // split on whitespace
}
IEnumerable<string[]> results = grid
.OrderBy(gridRow => TransformColumn6(gridRow[5]))
.ThenBy(gridRow => gridRow[1]);
foreach (string[] gridRow in results)
{
Debug.WriteLine(string.Join(" ", gridRow));
}
}
private static string TransformColumn6(string input)
{
if (char.IsDigit(input[0]))
{
// string is a bunch of numbers, use as-is.
return input;
}
int digitIndex = input.IndexOfAny(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' });
if (digitIndex == -1)
{
// string has no numbers, use as-is, will be sorted in alphabetical order after all the numbers.
return input;
}
// string has a number, remove the stuff at the beginning.
return input.Substring(digitIndex);
}
TEXT OTHERTEXT 269.665 198.144 180 1111
TEXT TEXT-1 227.905 174.994 180 1111
TEXT TEXT-2 236.135 198.644 90 ABC1111
TEXT DIFTEXT2 242.210 181.294 180 2222
TEXT OTHERTEXT 269.665 179.894 180 4444
TEXT DIFTEXT 227.905 203.244 180 9999
TEXT SOMETEXT 250.610 201.594 0 DDDD