在c#中选择数组的特定元素
本文关键字:元素 数组 选择 | 更新日期: 2023-09-27 17:53:21
我在c#中选择数组的某些元素时遇到了一些困难。
想象下面的数据:
-3,-3
-2,-2
-1,-1
0,0
1,1
2,2
3,3
它们是笛卡尔坐标系中直线上的点。现在我将它们存储在这样的数组中
int[,] linePoints
现在我想创建另一个数组,它不包含'linePoints'数组的前N个元素和后M个元素。怎样才能做到呢?
如果N = 2 M = 2结果数组应该是
-1,-1
0,0
1,1
(我不想在这一步处理PointF,稍后我可以将缩短的数组转换为PointF[])
谢谢。
首先,我认为你不应该在这一点上放弃考虑PointF,但让我告诉你为什么。
如果你有这个数组:
int[,] linePoints;
如果你想删除"最上面"的N个元素和"最下面"的M个元素,你将需要做一些工作。
让我给你看看代码:
void Main()
{
int[,] linePoints =
{
{ -3, -3 },
{ -2, -2 },
{ -1, -1 },
{ 0, 0 },
{ 1, 1 },
{ 2, 2 },
{ 3, 3 },
};
int N = 2;
int M = 2;
// start of the code you're asking for
int width = linePoints.GetLength(1);
int newHeight = linePoints.GetLength(0) - (N + M);
int[,] newLinePoints = new int[newHeight, width];
for (int y = 0; y < newHeight; y++)
for (int x = 0; x < width; x++)
newLinePoints[y, x] = linePoints[N + y, x];
// end of the code you're asking for
linePoints.Dump();
newLinePoints.Dump();
}
现在,让我们看看如果使用PointF,上面的代码会是什么样子。
void Main()
{
PointF[] linePoints =
{
new PointF(-3, -3),
new PointF(-2, -2),
new PointF(-1, -1),
new PointF(0, 0),
new PointF(1, 1),
new PointF(2, 2),
new PointF(3, 3),
};
int N = 2;
int M = 2;
// start of the code you're asking for
PointF[] newLinePoints = linePoints
.Skip(N)
.Take(linePoints.Length - (N + M))
.ToArray();
// end of the code you're asking for
linePoints.Dump();
newLinePoints.Dump();
}
(注意:.Dump()
部分来自于我使用LINQPad测试我的代码的事实)
您在找:
for(int i = n; i<lineOfPoints.Length - m ;i++) line[i]
,你应该像这样声明你的行:
Piont[] lineOfPoints;
编辑:
@Rob,阿维德:谢谢你指出来。长度- m)
第一:使用Point或自定义结构代替点。然后你可以使用:
List<Point> points = // your points here
points = points.Skip(n).Take(points.Count-m-n).ToList();
但如果你仍然想使用数组,我强烈反对,主要是因为这样的问题,那么你可以使用这样的代码(未测试):
//int[,] linePoints
int[,] newLinePoints = new int[linePoints.Length-m-n,2] // not sure about order here
for(i = n; i < linePoints.Length - m; i++)
{
newLinePoints[i-n,0] = linePoints[i,0];
newLinePoints[i-n,1] = linePoints[i,1];
}
或者稍微优雅一点
List<Point> points = new List<Point>()
//add points
List<Point> foundPoints = points.GetRange(n, points.Count - n - m)
int[,] linePoints= new int[,]{ {-3,-3} ,{-2,-2}, {-1,-1}, {0,0}, {1,1}, {2,2}, {3,3} };
int n=2;
int m=2;
for(int i=n;i<linePoints.GetLength(0)-m;i++)
Console.WriteLine(linePoints[i,0] +","+ linePoints[i,0]);
据我所知,您希望从数组元素中获得跳过前n个和最后m个元素并将其存储在其他数组中您应该使用以下代码
int [,] newpoints = new int[n1,2];
int j = 0;
for (int i = n; i < N - m; i++)
{
newpoints[j, 0] = linePoints[i, 0];
newpoints[j, 1] = linePoints[i, 1];
++j;
}
,其中n1等于原数组行数减去nN为linePoints中的行数
for (int i = 0; i < n1; i++)
{
Console.WriteLine("{0},{1}",newpoints[i,0],newpoints[i,1]);
}
你可以试试这个
<>之前List points = new List();//用点数填满这里的点数列表。(新添加点(2,2));等。Point p = new Point(2,2);如果(points.Contains (p)){points.Remove (p);}//这将给你一个新的列表,其中满足谓词条件,其中点X不等于2,点Y不等于2var newList =点数。其中(p => px != 2 & px != 2);//注意,如果你使用上述方法,你不需要从点数列表中删除点(2,2)