2011-10-23 13 views
1

これは面白いはずです。この例ではリストで最初に利用可能な長さを見つける<long>

、最初に使用可能な数は2次のようになります。

は、私は次のコードを持っていると仮定することができます。この例では

List<long> myList = new List<long>(){0,1,10,3};

、最初の利用可能な数は '4' であろう。

List<long> myList = new List<long>(){0,1,2,3};

任意のアイデア?

+0

番号は常に0から始めるかの問題を持っています?あなたはリストを修正して、最初に利用可能な番号を後で尋ねますか? – svick

+0

数字は常にゼロから始まり、リストは必ず後で修正されます。 – Dementic

答えて

5

「利用可能」とは、「リストにまだ存在していない最も小さい負でない数字」を意味しますか?

私のような何か書くように誘惑されたい:

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要素を超えたとき...

+0

2番目の提案は最後の行にエラーがあり、その場合は '??'を適用できません。 – Dementic

+0

@Dementic:修正済み、ありがとうございます - 私は間違った表現で 'FirstOrDefault'を使っていました。 –

+0

私はちょうどLambda Linqが好きなので、私はあなたの3番目の方法を使いました。 – Dementic

2
list.Sort(); 

var range = Enumerable.Range(list.First(), list.Last()- list.First()); 

var number = range.Except(list).FirstOrDefault(); 
関連する問題