これは面白いはずです。この例ではリストで最初に利用可能な長さを見つける<long>
、最初に使用可能な数は2
次のようになります。
は、私は次のコードを持っていると仮定することができます。この例では
List<long> myList = new List<long>(){0,1,10,3};
、最初の利用可能な数は '4' であろう。
List<long> myList = new List<long>(){0,1,2,3};
任意のアイデア?
これは面白いはずです。この例ではリストで最初に利用可能な長さを見つける<long>
、最初に使用可能な数は2
次のようになります。
は、私は次のコードを持っていると仮定することができます。この例では
List<long> myList = new List<long>(){0,1,10,3};
、最初の利用可能な数は '4' であろう。
List<long> myList = new List<long>(){0,1,2,3};
任意のアイデア?
「利用可能」とは、「リストにまだ存在していない最も小さい負でない数字」を意味しますか?
私のような何か書くように誘惑されたい:
HashSet<long> existing = new HashSet<long>(list);
for (long x = 0; x < long.MaxValue; x++)
{
if (!existing.Contains(x))
{
return x;
}
}
throw new InvalidOperationException("Somehow the list is enormous...");
EDIT:別の方法として、あなたがリストを注文して、インデックスが値と同じではありません最初の値を見つけることができるの...
var ordered = list.OrderBy(x => x);
var differences = ordered.Select((value, index) => new { value, index })
.Where(pair => pair.value != pair.index)
.Select(pair => (int?) pair.index);
var firstDifference = differences.FirstOrDefault();
long nextAvailable = firstDifference ?? list.Count;
最後の行は次のようになります0からリストが連続しているような状況の別の代替の世話をすることです:
var nextAvailable = list.Concat(new[] { long.MaxValue })
.OrderBy(x => x)
.Select((value, index) => new { value, index })
.Where(pair => pair.value != pair.index)
.Select(pair => pair.index)
.First();
リストにlong.MaxValue + 1
要素が含まれていない限り、これは問題ありません。これは現在のバージョンの.NETでは不可能です。正直に言うと(それは...多くのメモリのです)、これはすでにそれがint
インデックスを服用Select
部分に起因するint.MaxValue
要素を超えたとき...
list.Sort();
var range = Enumerable.Range(list.First(), list.Last()- list.First());
var number = range.Except(list).FirstOrDefault();
番号は常に0から始めるかの問題を持っています?あなたはリストを修正して、最初に利用可能な番号を後で尋ねますか? – svick
数字は常にゼロから始まり、リストは必ず後で修正されます。 – Dementic