我有一些类型S
和T
(例如S=object
和T=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
的相同条目(索引方式)。>
答案 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 }
但是,这种方式不能使用匿名类型。