从左到右对多行列表数据进行排序
Sort list data from left to right for multiple lines
我正在做 aforge。我有一个数据列表,我在屏幕上的 blob 旁边绘制这些数据。我还将数据添加到列表框中。但是不是按照从左到右的顺序添加,而是按照 blob 的 XY 坐标添加,如下面第一个列表框所示。
我尝试通过 OrderBy 方法使用 Linq 对列表进行排序,但随后它按升序对整个列表进行排序。我不想这样,我希望列表按第一行排序,然后是下一行,依此类推。我尝试使用 take<> 按第一行对其进行排序,但它只对 5 int 的第一行进行排序,然后停止。
代码:
int n = 5;
elements = elements.Take(n).OrderBy(i => i).ToList();
foreach (var cogxx in elements)
{
listBox2.Items.Add(cogxx);
}
If List coord = new List{80,90,100,60,70,20,40,30,10,50,} 如果用户输入 int row 是 2 那么输出应该是 {60,70,80,90,100 ,10,20,30,40,50} 我该怎么做?
如果您没有特殊的 class 代表您的 Line
对象,那么您可以使用 regex
来解析字符串。在这种情况下,我使用 name capture group
of Regex
:
List<string> elements = new List<string>
{
"Line 1 int 1",
"Line 2 int 1",
"Line 1 int 2",
"Line 1 int 3",
"Line 2 int 2",
"Line 2 int 12",
};
var pattern = @"^\bLine \b(?<num1>\d+) \bint \b(?<num2>\d+)$";
Regex regex = new Regex(pattern);
var query =
from e in elements
where regex.Match(e).Success
orderby
int.Parse(regex.Match(e).Groups["num1"].Value),
int.Parse(regex.Match(e).Groups["num2"].Value)
select e;
var orderedResult = query.ToList();
或者与 fluent API LINQ 相同:
var orderedResult =
elements
.Where(e => regex.Match(e).Success)
.OrderBy(e => int.Parse(regex.Match(e).Groups["num1"].Value))
.ThenBy(e => int.Parse(regex.Match(e).Groups["num2"].Value))
.ToList();
orderedResult
应该是:
Line 1 int 1
Line 1 int 2
Line 1 int 3
Line 2 int 1
Line 2 int 2
Line 2 int 12
更新:
创建一个 class 和扩展方法,将您的列表分成块:
public static class MyLinqExtensions
{
public static IEnumerable<IEnumerable<T>> Batch<T>(
this IEnumerable<T> source, int batchSize)
{
using (var enumerator = source.GetEnumerator())
while (enumerator.MoveNext())
yield return YieldBatchElements(enumerator, batchSize - 1);
}
private static IEnumerable<T> YieldBatchElements<T>(
IEnumerator<T> source, int batchSize)
{
yield return source.Current;
for (int i = 0; i < batchSize && source.MoveNext(); i++)
yield return source.Current;
}
}
此代码取自 this answer。
然后按以下方式使用 Batch
扩展方法:
List<int> coord = new List<int> { 80, 90, 100, 60, 70, 20, 40, 30, 10, 50 };
int n = 5;
var orderedResult =
coord.Batch(n)
.Select(b => b.OrderBy(i => i))
.SelectMany(x => x)
.ToList();
如果你想学习 LINQ,LINQPad 是你的朋友。
我正在做 aforge。我有一个数据列表,我在屏幕上的 blob 旁边绘制这些数据。我还将数据添加到列表框中。但是不是按照从左到右的顺序添加,而是按照 blob 的 XY 坐标添加,如下面第一个列表框所示。
我尝试通过 OrderBy 方法使用 Linq 对列表进行排序,但随后它按升序对整个列表进行排序。我不想这样,我希望列表按第一行排序,然后是下一行,依此类推。我尝试使用 take<> 按第一行对其进行排序,但它只对 5 int 的第一行进行排序,然后停止。
代码:
int n = 5;
elements = elements.Take(n).OrderBy(i => i).ToList();
foreach (var cogxx in elements)
{
listBox2.Items.Add(cogxx);
}
If List coord = new List{80,90,100,60,70,20,40,30,10,50,} 如果用户输入 int row 是 2 那么输出应该是 {60,70,80,90,100 ,10,20,30,40,50} 我该怎么做?
如果您没有特殊的 class 代表您的 Line
对象,那么您可以使用 regex
来解析字符串。在这种情况下,我使用 name capture group
of Regex
:
List<string> elements = new List<string>
{
"Line 1 int 1",
"Line 2 int 1",
"Line 1 int 2",
"Line 1 int 3",
"Line 2 int 2",
"Line 2 int 12",
};
var pattern = @"^\bLine \b(?<num1>\d+) \bint \b(?<num2>\d+)$";
Regex regex = new Regex(pattern);
var query =
from e in elements
where regex.Match(e).Success
orderby
int.Parse(regex.Match(e).Groups["num1"].Value),
int.Parse(regex.Match(e).Groups["num2"].Value)
select e;
var orderedResult = query.ToList();
或者与 fluent API LINQ 相同:
var orderedResult =
elements
.Where(e => regex.Match(e).Success)
.OrderBy(e => int.Parse(regex.Match(e).Groups["num1"].Value))
.ThenBy(e => int.Parse(regex.Match(e).Groups["num2"].Value))
.ToList();
orderedResult
应该是:
Line 1 int 1
Line 1 int 2
Line 1 int 3
Line 2 int 1
Line 2 int 2
Line 2 int 12
更新:
创建一个 class 和扩展方法,将您的列表分成块:
public static class MyLinqExtensions
{
public static IEnumerable<IEnumerable<T>> Batch<T>(
this IEnumerable<T> source, int batchSize)
{
using (var enumerator = source.GetEnumerator())
while (enumerator.MoveNext())
yield return YieldBatchElements(enumerator, batchSize - 1);
}
private static IEnumerable<T> YieldBatchElements<T>(
IEnumerator<T> source, int batchSize)
{
yield return source.Current;
for (int i = 0; i < batchSize && source.MoveNext(); i++)
yield return source.Current;
}
}
此代码取自 this answer。
然后按以下方式使用 Batch
扩展方法:
List<int> coord = new List<int> { 80, 90, 100, 60, 70, 20, 40, 30, 10, 50 };
int n = 5;
var orderedResult =
coord.Batch(n)
.Select(b => b.OrderBy(i => i))
.SelectMany(x => x)
.ToList();
如果你想学习 LINQ,LINQPad 是你的朋友。