如何防止哈希结构中的可变对象使用?

时间:2017-05-26 02:43:09

标签: c# hash

我觉得有必要重新定义Equals,这取决于我对象的可变值。由于我无法想出任何合理的方法来满足不可更改的哈希码的HashSet契约,我至少会以任何方式保护自己,而不是将这些麻烦的对象放在哈希结构中。反正有吗?

2 个答案:

答案 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方法由GetHashCodeDictionary使用,因此如果您在将其用作集合中的键时更改了对象(变异),那么关键是否定的更长的有效。

您可能想要采取的另一种方法是选择密钥作为不可变的东西,但对象本身是可变的。例如,美国的每个人都有社会安全号码(加拿大的社会保险号码)。您可以更改此人的姓名,出生日期等,但该人仍然是同一个人,您可以随时通过社会安全号码识别该人。现在,您可能拥有社会安全号码以外的其他东西,例如订单,但您可能在系统中有订单的标识符(数据库主键),因此您可以将其用作密钥。