1

LINQを学習していて、保留中のリクエストを使用したいのですが、この問題があります

            List<string> _strs = new List<string> { "1", "2", "1", "1", "0" };
            var selind = _strs.Select((name, ind) => new { indexname = name, index = ind }).Where(o => o.indexname == "1");
            string sind = "";
            foreach (var item in selind)
                sind += item.index.ToString() + " ";
            //i get 0 2 3 
            _strs.Add("2");
            _strs.Add("1");
            sind = "";
            foreach (var item in selind)
                sind += item.index.ToString() + " ";
            //Good, i get 0 2 3 6
            _strs = new List<string>() { "1" };
            sind = "";
            foreach (var item in selind)
                sind += item.index.ToString() + " ";
            //Why i get again 0 2 3 6

理由はわかりますが、2つのことを知りたいと思います。

  • どのようにメモリをクリアする必要がありますか?

    selind = null; それとももっといい方法を教えてもらえますか?

  • _strsを完全に再構築した後のselindでの作業では、2つの方法があります

            _strs.Clear();
            _strs.Add();
    

またはもう一度お電話ください

selind = _strs.Select((name, ind) => new { indexname = name, index = ind }).Where(o => o.indexname == "1");

別の方法でアドバイスしてもらえますか?

前もって感謝します!

4

1 に答える 1

2

あなたの質問:

_strs.Select((name, ind) => new { indexname = name, index = ind }).Where(o => o.indexname == "1");

特定の変数名ではなく、メモリ内の特定のリスト参照(_strsその時点で何であれ)に関連付けられています。それらは同じものではありません。これを行うとき:

_strs = new List<string>() { "1" };

最初にポイントされた場所のメモリ参照をクリアしていません_strs。代わりに、その変数名が新しいメモリ位置を指すようにしています。一方_strs.Clear()、元のリストはクリアされます。

問題の最善の解決策は、リストを受け入れる関数でLINQクエリをラップすることです。これにより、新しいリストで、もう一度入力しなくても呼び出すことができます。または、ユースケースによっては、.Clear()やり直す必要があるときに電話するだけです。

(これが明確でない場合は、以前は指して_strs = nullいたリストには何もしません。特定の変数名が無効になるだけです)_strs

于 2012-05-04T07:13:15.923 に答える