我觉得有必要重新定义Equals,这取决于我对象的可变值。由于我无法想出任何合理的方法来满足不可更改的哈希码的HashSet契约,我至少会以任何方式保护自己,而不是将这些麻烦的对象放在哈希结构中。反正有吗?
答案 0 :(得分:1)
不是。
在.Net框架中使用散列的所有类型(如Dictionary
)都不对“key”参数施加任何限制。非通用版本允许将任何object
用作密钥,并允许任何类型使用通用。
使用泛型类型(使密钥类型更加可见)和代码审查只是我所知道的路径。
答案 1 :(得分:1)
@model IEnumerable<Application.Models.Machine>
@{
ViewData["Title"] = "Test";
}
<h2>Management</h2>
<hr />
<table class="table" asp-action="Test">
<thead>
<tr>
<th>Serial</th>
<th>Tienda</th>
<th>Precio por Jugada</th>
<th>Estado</th>
<th>Update</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
<div class="form-group">
<div class="col-md-10">
<input asp-for="@item.MchName" readonly class="form-control" />
<span asp-validation-for="@item.MchName" class="text-danger"></span>
</div>
</div>
</td>
<td>
<div class="form-group">
<div class="col-md-10">
<select asp-for="@item.StoreID" class="form-control" asp-items="ViewBag.StoreID">
<option value="">-- Seleccione Tienda --</option>
</select>
<span asp-validation-for="@item.StoreID" class="text-danger"></span>
</div>
</div>
</td>
<td>
<div class="form-group">
<div class="col-md-10">
<input type="number" max="10" step=".1" asp-for="@item.PUnit" class="form-control" />
<span asp-validation-for="@item.PUnit" class="text-danger"></span>
</div>
</div>
</td>
<td>
<div class="form-group">
<div class="col-md-10">
<select name="Status" asp-for="@item.Status" class="form-control">
<option value="0">Operativo</option>
<option value="1">Nuevo Item</option>
<option value="2">Reparación</option>
</select>
<span asp-validation-for="@item.Status" class="text-danger"></span>
</div>
</div>
</td>
<td>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<input type="hidden" value="@item.Id" name="Id" />
<input type="submit" value="Update" />
}
</td>
</tr>
}
</tbody>
方法用于值相等。如果您的对象是可变的,那么您可以编写自己的Equals
。它将使用它来确定对象是否仍然等于另一个对象。
IEqualityComparer
方法由GetHashCode
和Dictionary
使用,因此如果您在将其用作集合中的键时更改了对象(变异),那么关键是否定的更长的有效。
您可能想要采取的另一种方法是选择密钥作为不可变的东西,但对象本身是可变的。例如,美国的每个人都有社会安全号码(加拿大的社会保险号码)。您可以更改此人的姓名,出生日期等,但该人仍然是同一个人,您可以随时通过社会安全号码识别该人。现在,您可能拥有社会安全号码以外的其他东西,例如订单,但您可能在系统中有订单的标识符(数据库主键),因此您可以将其用作密钥。