我是C#-Newbie。
我的函数应该从列表中返回所有值,该函数具有匹配的时间戳记:
static public PointCloud getPointsByTime (float time)
{
PointCloud returnList = new List<PointData> ();
for (int i = 0; i < _pointCloud.Count; i++) {
if (_pointCloud [i].time == time) {
returnList.Add (_pointCloud [i]);
}
}
return returnList;
}
其中
public class PointData
{
public float time;
// and some other members
}
和
// let's call a list of PointData-objects a PointCloud
using PointCloud = System.Collections.Generic.List<PointData>;
我的功能会做我想做的事吗?还是我必须创建一个新的PointData
-Object?我可以使用我返回的PointCloud
还是不超出范围并删除?
这可能不是解释的最好例子,因此可以随意将我链接到更好的东西。我认为您得到了我的基本拼接。
@patrick建议继承列表似乎更合理,但是我会走得更远,我只会使用列表,这样您就不会创建不必要的类,如果它不添加列表任何额外的东西。
也建议您查看Linq,这使代码更可读,并且是您希望尽快掌握的非常强大的功能。:)
您的方法可以看起来像这样:
_pointCloud.Where(p => p.time == time).ToList();
也尝试熟悉属性:
public class PointData
{
public float Time { get; set; }
}
您可能需要遵循更标准的C#编码样式(尽管这是完全个人的),将Pascalcase用于公共成员而不是骆驼。
您的代码正确。您可以这样使用您的功能:
var someTime = 0.0f;
var pointsAtTime = getPointsByTime(someTime);
DoSomethingWith(pointsAtTime);
如果将其分配给某些局部变量(例如,在此处使用pointsAtTime
),则函数的返回值保留在范围中。
编辑:正如彼得·施耐德(Peter Schneider)在注释中正确指出的那样,您需要意识到此功能在匹配点上创建了一个带有 References 的新列表,并且不会创建新的点。这可能是您想要的也可能不是您想要的。
但是,如果您是C#的新手,那么您可能想记住以下一些事情:
- C#中的方法通常在Titlecase中命名,例如
GetPointsByTime
,而不是getPointsByTime
。 - 将名称分配给诸如
using PointCloud = List<PointData>
之类的通用类型,虽然在技术上允许,但并不是很惯用,可能会使您的代码中的其他读者感到困惑。如果您认为PointData的列表足够特殊,可以拥有自己的类型,请为其创建一种类型(通过从List<PointData>
继承,或者最好使用IList<PointData>
作为新PointCloud
类中的成员)。或者只使用using System.Collections.Generic
并在整个代码中使用List<PointData>
,这是大多数人会做的。 - 比较平等的浮点数有时会灰心,因为在某些情况下,由于表示错误,这可能会失败;如果时间确实是一个连续的价值,则可能需要在特定时间段内查找点(例如,在您所需的时间围绕某个范围内的点)。但是,您现在不必担心这一点。