2

IntExtensions クラスに 2 つのメソッドがあり、次の使用可能な増分値 (除外する必要がある既存の整数のリストにはありません) を生成するのに役立ちます。私は最善の方法で NextIncrementalValueNotInList メソッドに対処しているとは思わず、linq を使用して次に利用可能な int を返すことができるかどうか疑問に思っていますか?

public static bool IsInList(this int value, List<int> ListOfIntegers) {
    if (ListOfIntegers.Contains(value))
        return true;

    return false;
}

public static int NextIncrementalValueNotInList(this int value, 
                                                List<int> ListOfIntegers) {

        int maxResult;
        maxResult = ListOfIntegers.Max() + 1;

        for (int i = value; i <= maxResult; i++)
        {
            if (!(i.IsInList(ListOfIntegers)))
            {
                return i;
            }
        }
        return maxResult;
    }
4

3 に答える 3

5

linq を使用すると、メソッドは次のようになります。

return IEnumerable.Range(1, ListOfIntegers.Count + 1)
                  .Except(ListOfIntegers)
                  .First();
于 2013-10-30T09:45:17.390 に答える
2

1から始まると思います。

次のように進めることもできます。

IEnumerable.Range(1, ListOfIntegers.Count)
           .Where(i => !ListOfIntegers.Contains(i))
           .Union(new []{ ListOfIntegers.Count + 1 })
           .First();
于 2013-10-30T09:31:36.623 に答える
2

実際にMax値を計算する必要はありiません。リストに存在しない値が見つかるまで、値を増やし続けてください。たとえば、次のようになります。

public static int NextIncrementalValueNotInList(this int value, 
  List<int> ListOfIntegers)
{
    int i = value;

    while(true)
    {
        if (!(i.IsInList(ListOfIntegers)))
        {
            return i;
        }
        i++;
    }
    return maxResult;
}

. それに加えて、次の場合を除いて、これについてできることがもっとあるかどうかはわかりません。

  • ListOfIntegersソートされていることが保証されているか、ソートされる必要がある
  • ListOfIntegersである必要はありませんList<int>

最初の答えが「いいえ」で、2 番目の答えが「はい」の場合は、代わりに を使用できますHashSet<int>。これにより、独自のメソッドを単純に使用できるようになるため、より高速な実装が提供される可能性があります。HashSet<T>bool Contains(T)

public static int NextIncrementalValueNotInList(this int value, 
  HashSet<int> ListOfIntegers) 
{
    int i = value;
    while(true)
    {
        if (!(ListOfIntegers.Contains(i))
        {
            return value;
        }
        i++;
    }
}

このバージョンでは、Maxチェックをなくす方法も示されていることに注意してください。

ただし、時期尚早の最適化には注意してください。現在の実装が十分に高速であれば、心配する必要はありません。極端なケースと実際のケースで代替ソリューションを適切にベンチマークして、実際に違いがあるかどうかを確認する必要があります。

また、やりたくないことは、上記の私の提案を使用して、リストHashSetをすべての呼び出しに変えることです。Listtoの使用を完全に変更することをお勧めしますHashSet- 呼び出しごとに断片的な変換を行うと、HashSet.

最後に、整数リストで多くの断片化を実際に期待していない場合は、 aHashSetが現在の Linq バージョンとあまり変わらない可能性があります。

于 2013-10-30T09:43:10.130 に答える