1


0

どうやってFunc <T、TResult>からオリジナルのList <T>のコピーを返すのですか?

列挙されているコレクションは、 "Foreach"ステートメント内では変更できないことがわかりました(難しい方法で)。

_ 「コレクションが変更されました。列挙操作は実行できません。」 _

さて、私が思いついた解決策は、辞書キーを含む同じサイズのダミーコレクションを作成し、それを列挙して問題のコレクションを修正することです。

    private void InvalidateAuthenticatedNodes()
    {
        var dummy = new Dictionary(_AuthenticatedNodes.Count);
        foreach (var nodeId in _AuthenticatedNodes.Keys)
            dummy[nodeId] = false;

        foreach (var nodeId in dummy.Keys)
            _AuthenticatedNodes[nodeId] = false;

        ClearAuthenticatedDateTime();
    }

上のコードはうまくいきました。次のようにFuncデリゲートを使用してキーのコピーを返すように、上記のコードをリファクタリングしています。

    private void InvalidateAuthenticatedNodes()
    {
        var getNodeIds =
            new Func, IEnumerable>(
                nodes => nodes.Select(node => node.Key));
        foreach (var nodeId in getNodeIds(_AuthenticatedNodes))
        {
            _AuthenticatedNodes[nodeId] = false;
        }

        ClearAuthenticatedDateTime();
    }

私が期待したものとは異なり、_getNodeIds_はコピーを返しません。 代わりにコピーを返す方法はありますか?

*編集:https://stackoverflow.com/questions/615310/how-do-you-return-a-copy-of-original-listt-from-funct-tresult/615314#615314[JaredPar’s answerより前の一時的な結果]

JaredParの答えと似ていますが、彼はもっと簡潔で、私は彼の答えを取り入れました。 しかし、これは私が共有するために思いついた同様の結果です。

    private void InvalidateAuthenticatedNodes()
    {
        var getNodeIds =
            new Func, IEnumerable>(nodes =>
                nodes.Select(node => node.Key));
        foreach (var nodeId in getNodeIds(_AuthenticatedNodes).ToList())
        {
            _AuthenticatedNodes[nodeId] = false;
        }

        ClearAuthenticatedDateTime();
    }

*編集:最終結果(洗練された)

_AuthenticatedNodes.Keys.ToList().ForEach(
    nodeId => _AuthenticatedNodes[nodeId] = false);

3 Answer


4


コレクションの最後に.ToList()を追加するだけで、リストの完全なコピーが自動的に返されます。

foreach(_AuthenticatedNodes.Keys.ToList()内のvar nodeId)...


1


foreachを使う代わりに、あなたはnormalを使うことができます。 ただし、アイテムを追加または削除するときには注意してください。コレクション内の要素のインデックスが変更されます。


1


Enumerableクラスを変更すると、元の列挙子が無効になる可能性があるため、コピーを作成してそこで変更を加える必要があります。