4

vStreamID変数に乱数を割り当てたいのですが。辞書に生成された番号が含まれている限り、この番号は新しく生成されmd_StreamDictます。

ロングバージョン:

vStreamID = (new Random()).Next(1000, 9999).ToString();
while (md_StreamDict.ContainsKey(vStreamID)) {
    vStreamID = (new Random()).Next(1000, 9999).ToString();
}

LINQスタイルのものが欲しい

md_StreamDict.ContainsKey(vStreamID)
    .while( x => x = (new Random())
    .Next(1000, 9999)
    .ToString();

上記の例はバナナです。しかし、これを達成するための実際の方法があれば幸いです。いいえ、読みやすさについての通常の議論を再開することはありません。;)

4

5 に答える 5

4

乱数をストリーミングするための無限列挙型を生成する方法が必要です。Enumerable.Range(0, int.MaxValue)を使用して概算できます。

var rand = new Random();
var r = Enumerable.Range(0, int.MaxValue)
    .Select(s => rand.Next(1000, 9999))
    .SkipWhile(s => md_StreamDict.ContainsKey(s.ToString()))
    .First();

次にr、辞書に含まれていない新しいキー値が含まれます。

于 2012-12-28T13:48:00.373 に答える
4

私があなたを正しく理解していれば、よく知られている範囲の数値が必要であり、この数値はまだ辞書に載っていてはならないので、なしでこれを行ってくださいRandom

Enumerable.Range(1000, 9999)
          .Where(n => !dict.ContainsKey(n))
          .FirstOrDefault();
于 2012-12-28T13:48:54.410 に答える
3

ここにもバナナがあります:

次のような乱数を生成する IEnumerable を作成できます。

public class RandomList : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        Random r = new Random();

        while (true)
            yield return r.Next(1000, 9999);
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

次に、次のことができます。

// I guess one could implement a seed constructor, if one was so inclined
RandomList rl = new RandomList(); 

int vStreamID = rl.SkipWhile(i => md_StreamDict.ContainsKey(i)).First();
于 2012-12-28T13:50:01.150 に答える
2

今、私はあなたの質問を 3 回読みましたが、なぜ (またはどのように) 誰かが LINQ 式でこれを行うのかまだわかりません。私が見る唯一の短い解決策は、コメントに書いたものです:

var r = new Random();

do {
    vStreamID = r.Next(1000, 9999).ToString();
} while (md_StreamDict.ContainsKey(vStreamID));
于 2012-12-28T13:45:30.993 に答える
2

1 つのアプローチは、yield を使用して値を返すことです。

 private static Random rand = new Random();

    private static void Test()
    {
        Dictionary<string, string> values = new Dictionary<string, string>();
        string vStreamId = GetNewValues().Where(x => !values.ContainsKey(x)).First();
    }

    public static IEnumerable<string> GetNewValues()
    {
        While(true)
        {
           yield return rand.Next(1000, 9999).ToString();
        }
    }

ループごとに新しい Random を生成すると、システム クロックに基づいているため、毎回同じ値が得られることに注意してください。

于 2012-12-28T13:50:06.450 に答える