是否有一个预先存在的函数将基于基数和“偏移量”返回一组数字
本文关键字:偏移量 返回 数字 一组 存在 有一个 函数 于基数 是否 | 更新日期: 2023-09-27 18:35:52
我不想重新发明轮子:如果我想从给定数字中获取 N 范围内的每个整数,最有效的方法是什么?
我的意思是这样的:
public List<int> getIntsWithinN(int BaseInt, int Offset)
。因此,如果传入的参数为 7 和 3,则结果将是 4..10;如果传入的参数为 42 和 7,则结果为 35..49,依此类推。
更新
好的,我终于开始尝试实现这一点了。但我不知道我是否应该像这样将我的列表传递给 ToList():
List<int> listInts = new List<int>();
. . .
Enumerable.Range(lineNum - Offset, Offset * 2 + 1).ToList(listInts);
。或者这样做:
listInts = Enumerable.Range(lineNum - Offset, Offset * 2 + 1).ToList();
。但我需要做的是多次调用它,所以智能感知描述似乎不是我真正需要的。它说,"创建一个...清单..."
但我不希望每次都创建一个新列表,我想附加到现有列表中,最好同时忽略重复项。
我不认为会有确切的函数,但我认为这是最短和最简单的:
Enumerable.Range(BaseInt - Offset, Offset * 2 + 1).ToList()
最好同时忽略重复项
在这方面,您应该考虑HashSet<int>
.
var hashSet = new HashSet<int>();
hashSet.UnionWith(Enumerable.Range(lineNum - offset, offset * 2 + 1));
如果你想要一个列表,你可以在最后拨打ToList()
hashSet
。您可能还希望在转换为列表时对其进行排序,因为HashSet<T>
以未定义的顺序保存项目。
var list = hashSet.OrderBy(i=>i).ToList();
你可以创建这样的方法:
public static IEnumerable<int> getIntsWithinN(int BaseInt, int Offset)
{
return getIntsWithinN(Enumerable.Empty<int>(), BaseInt, Offset);
}
public static IEnumerable<int> getIntsWithinN(this IEnumerable<int> source, int BaseInt, int Offset)
{
return source.Concat(Enumerable.Range(BaseInt - Offset, Offset * 2 + 1));
}
像这样使用:
var myBigList = Extensions.getIntsWithinN(7, 3).getIntsWithinN(42, 7);
然后取决于你想要它从那里,例如
var withDupsRemoved = new HashSet<int>(myBigList);
var withDupsRemoved = new HashSet<int>(myBigList).OrderBy(x => x).ToList();
如果范围的插入顺序很重要,但您不希望重复项,则可以创建如下列表:
var withDupsRemoved = new List<int>();
foreach (var i in myBigList)
if (!withDupsRemoved.Contains(i))
withDupsRemoved.Add(i);
如果性能问题成为问题,您可以滚动自己的类来存储范围边界,而不是使用 LINQ 的 Concat,当追加两个或多个时,如果存在重叠,则相应地调整范围。