1. ホーム
  2. c#

C# 7は配列/列挙型のデストラクチャリングが可能か?

2023-12-17 22:16:21

質問

JavaScript ES6では、このように配列を再構築することができます。

const [a,b,...rest] = someArray;

ここで a は配列の最初の要素です。 b は2番目の要素、そして rest は残りの要素を持つ配列である。

私はC#7で、割り当て中にタプルを再構築できることを知っていますが、このような配列/列挙体の再構築に関連するものを見つけることができませんでした。

var (a,b) = someTuple;

私は IEnumerable で、最初と2番目の要素は変数として必要で、残りの要素は別のIEnumerableとして必要です。私は解決策を持っていますが、再構築がよりきれいに見えると感じています。

どのように解決するのですか?

C#言語の機能と完全に統合された解決策を求めるなら Evkの回答 をお使いください。これは実装の詳細をある程度隠します。それを気にしないのであれば、どちらの回答も使うことができます。


私の知る限り、それはありません。しかし、似たようなものを作るのはそれほど難しくありません。

このような拡張メソッドはどうでしょう。

public static class EX
{
    public static void Deconstruct<T>(this T[] items, out T t0)
    {
        t0 = items.Length > 0 ? items[0] : default(T);
    }

    public static void Deconstruct<T>(this T[] items, out T t0, out T t1)
    {
        t0 = items.Length > 0 ? items[0] : default(T);
        t1 = items.Length > 1 ? items[1] : default(T);
    }
}

という具合に使うことができます。

int[] items = { 1, 2 };

items.Deconstruct(out int t0);

欠点は、返す項目の数だけ拡張メソッドが必要なことです。そのため、返す変数が数個以上ある場合、この方法はあまり有用ではないかもしれません。

長さのチェックやそれに関連することを省いていることに注意してください。