如何在c#中像在Javascript中一样匹配两个数组

本文关键字:数组 两个 一样 Javascript | 更新日期: 2023-09-27 18:08:31

为了确保两个数组在Javascript中是相同的,这就是我所做的:(在item1中缺少数据的地方插入零)

    var viewModel = @Html.Raw(Json.Encode(Model));
    var items = viewModel.Date1;
    var items2 = viewModel.Date2;
    items = items2.map( row => 
        //is there a matching row in items?
        items.filter( r => r.theString == row.theString).length ==  0 ? 
       //if not, fill with zeros
              {theString:0, theCount:0} : 
       //if there is, return the items' row
       items.filter( r => r.theString == row.theString)[0] );

我将柱状图中的数据用作百分比。我需要以表的形式显示结果,其中包含实际的计数数,如下所示:

<div style="padding-top: 30px">
    <table id="table_id" class="display">
        <thead>
            <tr>
                <th>Month</th>
                <th>Cancelled</th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
            @using (var e1 = Model.Date1.Reverse().GetEnumerator())
            {
                using (var e2 = Model.Date2.Reverse().GetEnumerator())
                {
                    while (e1.MoveNext() && e2.MoveNext())
                    {
                        var item1 = e1.Current;
                        var item2 = e2.Current;
                        <tr>
                            <td>@item1.theDate.Value.ToString("MMMM-yyyy") </td>
                            <td>@item1.theCount</td>
                            <td>@item2.theCount</td>
                        </tr>
                    }
                }
            }
        </tbody>
    </table>
    </div>

问题是这些数组没有被修复以相互匹配,所以它显示的数据是不正确的。日期(theDate)与值不匹配

或者我可以从javascript中使用items和items2来制作表吗?

如何在c#中像在Javascript中一样匹配两个数组

应该这样做:

@foreach (var item1 in Model.Date1.Reverse())
{
    var item2Count = Model.Date2.Where(i2 => i2.theDate == item1.theDate)
        .Select(i2 => i2.theCount)
        .FirstOrDefault();
    <tr>
        <td>@item1.theDate.Value.ToString("MMMM-yyyy") </td>
        <td>@item1.theCount</td>
        <td>@item2Count</td>
    </tr>
}

这与你发布的JavaScript具有相同的渐近复杂性,所以如果你有非常大量的项目,你可能会看到缓慢的性能。可以通过创建对Date2值的查找来解决这个问题,如下所示:

@{
var item2CountsByDate = Model.Date2.ToLookup(i => i.theDate, i => i.theCount);
foreach (var item1 in Model.Date1.Reverse())
{
    var item2Count = item2CountsByDate[item1.theDate]
        .FirstOrDefault();
    <tr>
        <td>@item1.theDate.Value.ToString("MMMM-yyyy") </td>
        <td>@item1.theCount</td>
        <td>@item2Count</td>
    </tr>
}
}