6

車輪の再発明はしたくありません: 特定の数値から 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();

...しかし、これを数回呼び出す必要があるため、Intellisense の説明は、私が本当に必要としているものとは思えません。「...リスト...を作成します」と表示されます

しかし、毎回新しいリストを作成するのではなく、既存のリストに追加し、できれば同時に重複を無視したいと考えています。

4

3 に答える 3

13

まさにこれのための関数があるとは思いませんが、これが最も短くて簡単だと思います:

Enumerable.Range(BaseInt - Offset, Offset * 2 + 1).ToList()
于 2012-06-01T01:07:35.110 に答える
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を使用する代わりに、範囲の境界を格納する独自のクラスをロールできます。2つ以上が追加された場合、重複がある場合は、範囲が適切に調整されます。

于 2012-06-01T22:33:54.287 に答える
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 に答える