6

我不想重新发明轮子:如果我想从给定的数字中获取 N 范围内的每个整数,那么最有效的方法是什么?

我的意思是这样的:

public List<int> getIntsWithinN(int BaseInt, int Offset)

...所以如果传入的参数是 7 和 3,结果将是 4..10;如果传入的 args 是 42 和 7,则结果将是 35..49,等等。

更新

好的,我终于开始尝试实现这一点。但我不知道我是否应该像这样将我的 List 传递给 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();

...但我需要做的是多次调用它,所以 Intellisense 描述似乎不是我真正需要的。它说,“创建一个......列表......”

但我不希望每次都创建一个新列表,我想附加到现有列表中,最好同时忽略重复项。

4

3 回答 3

13

我不认为会有一个函数来解决这个问题,但我认为这是最短和最简单的:

Enumerable.Range(BaseInt - Offset, Offset * 2 + 1).ToList()
于 2012-06-01T01:07:35.110 回答
1

最好同时忽略重复

在那你应该考虑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();
于 2012-06-01T22:17:33.810 回答
1

你可以制作这样的方法:

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,您可以滚动您自己的存储范围边界的类,并且当附加两个或更多时,如果存在重叠,则适当地调整范围。

于 2012-06-01T22:33:54.287 回答