将数组对转换为对数组(如果可能,使用LINQ)

时间:2018-11-30 13:28:49

标签: c# arrays linq ienumerable valuetuple

我有一些类型ST(例如S=objectT=string)。 我有一对这些类型的数组,即

(S[], T[]) pairOfArrays;

,我想将其转换为成对的数组,即

(S, T)[] arrayOfPairs;

我该怎么做?如果可能,我对LINQ解决方案最感兴趣。 请假定pairOfArrays中的两个数组具有相同的长度。


我知道另一个方向:

pairOfArrays = (arrayOfPairs.Select(i => i.Item1).ToArray(),
                arrayOfPairs.Select(i => i.Item2).ToArray());

我所寻求的方向存在的问题是:为了进行迭代(使用Select等),我需要一个IEnumerable,但是(S[], T[])不是IEnumerable。而且,如果我以pairOfArrays.Item1.Select(...开头,那么我不知道如何到达Item2语句中当前所在的Select的相同条目(索引方式)。

2 个答案:

答案 0 :(得分:4)

使用Zip,可以获得相应的元素并将其转换为元组:

var arrayOfPairs = pairOfArrays.Item1.Zip(pairOfArrays.Item2, (f, s) => new Tuple<S, string>(f, s))
                               .ToArray();

或从C#7开始:

var arrayOfPairs = pairOfArrays.Item1.Zip(pairOfArrays.Item2, (f, s) => (f, s))
                               .ToArray();

比上述方法更惯用的方法,但仍然可以使用Enumerable.Range

var arrayOfPairs = 
    Enumerable.Range(0, pairOfArrays.Item1.Length)
            .Select(index => (pairOfArrays.Item1[index], pairOfArrays.Item2[index]))
            .ToArray();

答案 1 :(得分:3)

您可以为此使用Zip

@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
    using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
    {
        @Html.AntiForgeryToken()       
        @Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "ChangePassword", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" } )
    }
}

<script>
    $(function () {
        $.ajaxSetup({ cache: false });

        $("a[data-modal]").on("click", function (e) {
            $('#myModalContent').load(this.href, function () {
                $('#myModal').modal({
                    /*backdrop: 'static',*/
                    keyboard: true
                }, 'show');
                bindForm(this);
            });
            return false;
        });
    });
   function bindForm(dialog) {
        $('form', dialog).submit(function () {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (result) {
                    if (result.success) {
                        $('#myModalLogin').modal('hide');
                        $('#replacetarget').load(result.url); // Carrega o resultado HTML para a div demarcada
                    } else {
                        $('#myModalContent1').html(result);
                        bindForm(dialog);
                    }
                }
            });
            return false;
        });
    }

</script>

这将显示var result = arrayOfS.Zip(arrayOfT, (first, second) => new { S = first, T = second }); 的列表。

另一种不错的老式循环:

{ S, T }

但是,这种方式不能使用匿名类型。