是否有一个预先存在的函数将基于基数和“偏移量”返回一组数字

本文关键字:偏移量 返回 数字 一组 存在 有一个 函数 于基数 是否 | 更新日期: 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,当追加两个或多个时,如果存在重叠,则相应地调整范围。