C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: LINQでDictionary内の連番の確認


(過去ログ 127 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■75505 / inTopicNo.1)  LINQでDictionary内の連番の確認
  
□投稿者/ nobb (75回)-(2015/03/31(Tue) 18:24:02)

分類:[C#] 

2015/03/31(Tue) 18:26:49 編集(投稿者)

Dictionary<int,Hoge>のオブジェクトに対してLINQでKeyが連番であるかを確認するにはどうしたらいいのでしょうか?

foreachでまわして1つ前のkeyを保存しておき差が1なら連番になってる、という事は思いついていますが
それをLINQでやってみたいと思いましたが、LINQがあまり理解できていないせいでまったく思いつきません。
LINQの勉強も兼ねてと考えていますが、LINQよりもオススメの方法があればそちらでも構いません。

# ちなみに最大300万レコード(単位がわからないのでレコード・・)くらいになりそうなDictionaryです

目的としては以下です。
連番になっていない場合の最小値
or
連番になっていない箇所の列挙

1,2,3,5,6,7,9なら3のみ取り出せる or 3,6を取り出せるという事です。
ただし、ここに書いた目的にこだわっている事はなく、「連番ではない」という判断を付き、その箇所(番号)が特定したいです。

環境:Visual Studio Pro 2013 Update4、C#、.NET Framework 4.5.1
引用返信 編集キー/
■75507 / inTopicNo.2)  Re[1]: LINQでDictionary内の連番の確認
□投稿者/ ainax (24回)-(2015/04/01(Wed) 01:43:13)
これでどうでしょうか?

static void Main(string[] args)
{
    var dic = new Dictionary<int, string>();

    for(int i = 1; i < 3000000; i++)
    {
        dic.Add(i, "hoge");
    }

    dic.Remove(10);
    dic.Remove(100);
    dic.Remove(1000);
    dic.Remove(10000);
    dic.Remove(100000);
    dic.Remove(1000000);

    // 事前に key がソートされていることが条件です
    var ret = dic.Where(d => !dic.ContainsKey(d.Key + 1)).ToDictionary(d => d.Key, d => d.Value);
    ret.Remove(ret.Last().Key);

    Console.WriteLine(ret.Keys.Select(k => k.ToString())
        .Aggregate((r, v) => r + "," + v));
    // 9,99,999,9999,99999,999999

    Console.Read();    
}

引用返信 編集キー/
■75509 / inTopicNo.3)  Re[2]: LINQでDictionary内の連番の確認
□投稿者/ nobb (76回)-(2015/04/01(Wed) 10:02:46)
No75507 (ainax さん) に返信
ありがとうございます。
見せていただければ理解できるものの、自分での発想は慣れないとなかなか難しいです。。。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -