说我有一个包含这样的对象的列表:
public class Person
{
private string _name;
private string _id;
private int _age;
public Person
{
}
// Accessors
}
public class ManipulatePerson
{
Person person = new Person();
List<Person> personList = new List<Person>;
// Assign values
private void PopulateList();
{
// Loop
personList.Add(person);
// Check if every Person has a unique ID
}
}
Run Code Online (Sandbox Code Playgroud)
我想检查每个人都有一个唯一的ID.我想返回一个布尔值true/false,具体取决于ID是否唯一.这是我用LINQ可以实现的吗?
我在C#项目中有一个复杂的类,我希望能够进行相等测试.这不是一个微不足道的阶级; 它包含各种标量属性以及对其他对象和集合的引用(例如IDictionary).为了它的价值,我的班级是密封的.
为了在我的系统中的其他地方启用性能优化(避免昂贵的网络往返的优化),我需要能够将这些对象的实例相互比较以实现相等 - 除了内置的引用相等 - 所以我重写了Object.Equals()实例方法.但是,现在我已经这样做了,Visual Studio 2008的代码分析又称FxCop,我默认启用它,它引发了以下警告:
警告:CA2218:Microsoft.Usage:由于'MySuperDuperClass'重新定义了Equals,它还应该重新定义GetHashCode.
我想我理解这个警告的基本原理: 如果我要将这些对象用作集合中的键,那么哈希码很重要.即看到这个问题.但是,我不打算将这些对象用作集合中的键.永远.
感觉有理由压制警告,我查找了MSDN文档中的代码CA2218以获取警告的全名,因此我可以将SuppressMessage属性应用于我的类,如下所示:
[SuppressMessage("Microsoft.Naming",
"CA2218:OverrideGetHashCodeOnOverridingEquals",
Justification="This class is not to be used as key in a hashtable.")]
Run Code Online (Sandbox Code Playgroud)
但是,在进一步阅读时,我注意到以下内容:
如何修复违规行为
要修复违反此规则的行为,请提供GetHashCode的实现.对于一对相同类型的对象,如果Equals的实现为该对返回true,则必须确保实现返回相同的值.
何时抑制警告
-----> 不要压制此规则的警告.[箭头和重点我的]
所以,我想知道:为什么我不应该按照我的计划来压制这个警告? 我的情况不是要求抑制吗?我不想为这个永远不会被调用的对象编写GetHashCode()的实现,因为我的对象永远不会成为集合中的键.如果我想要迂腐而不是抑制,那么用一个抛出NotImplementedException的实现覆盖GetHashCode()会更合理吗?
如果您定义的类型不会被用作容器中的键,那么这无关紧要.表示窗口控件,网页控件或数据库连接的类型不太可能用作集合中的键.在那些情况下,什么都不做.即使效率非常低,所有引用类型都将具有正确的哈希码.[...]在您创建的大多数类型中,最好的方法是完全避免GetHashCode()的存在.
...这就是我最初得到这个想法的地方,我不必总是关注GetHashCode().
当我需要比较2个列表并生成包含所有唯一项目的第3个列表时,我似乎总是遇到问题.我需要经常执行此操作.
尝试用一个简单的例子重现这个问题.
我错过了什么吗?谢谢你的任何建议
想要的结果
Name= Jo1 Surname= Bloggs1 Category= Account
Name= Jo2 Surname= Bloggs2 Category= Sales
Name= Jo5 Surname= Bloggs5 Category= Development
Name= Jo6 Surname= Bloggs6 Category= Management
Name= Jo8 Surname= Bloggs8 Category= HR
Name= Jo7 Surname= Bloggs7 Category= Cleaning
class Program
{
static void Main(string[] args)
{
List<Customer> listOne = new List<Customer>();
List<Customer> listTwo = new List<Customer>();
listOne.Add(new Customer { Category = "Account", Name = "Jo1", Surname = "Bloggs1" });
listOne.Add(new Customer { Category = "Sales", Name = "Jo2", …Run Code Online (Sandbox Code Playgroud) 我有2 IList<T>个相同类型的对象ItemsDTO.我想从另一个列表中排除一个列表.然而,这对我来说似乎没有用,我想知道为什么?
IList<ItemsDTO> related = itemsbl.GetRelatedItems();
IList<ItemsDTO> relating = itemsbl.GetRelatingItems().Except(related).ToList();
Run Code Online (Sandbox Code Playgroud)
我正在尝试related从relating列表中删除项目.
当GetHashCode()函数使用代码返回某些内容时,它是否有一些特殊含义contains ^ symbol?
public class ClassProp
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
public int Prop3 { get; set; }
public int Prop4 { get; set; }
public int Prop5 { get; set; }
public override int GetHashCode()
{
return Prop1.GetHashCode() ^ Prop2.GetHashCode() ^
Prop3.GetHashCode() ^ Prop4.GetHashCode() ^ Prop5.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud) 我必须遵循以下课程:
public class NominalValue
{
public int Id {get; set;}
public string ElementName {get; set;}
public decimal From {get; set;}
public decimal To {get; set;}
public bool Enable {get; set;}
public DateTime CreationDate {get; set;}
public int StandardValueId {get; set;} //FK for StandardValue
}
public class StandardValue
{
public int Id {get; set;}
public string ElementName {get; set;}
public decimal From {get; set;}
public decimal To {get; set;}
public bool Enable {get; set;}
public DateTime CreationDate {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
用户想要填充 …
我目前正在尝试使用 xUnit 比较两个列表,其中包含相同的项目,但在运行时出现错误。
Assert.Equal(expectedList, actualList);
Run Code Online (Sandbox Code Playgroud)
错误:
"Assert.Equal() Failure"
Expected: List<myObject> [myObject { modifier = '+', name = "name", type = "string" }, myObject { modifier = '+', name = "age", type = "int" }]
Actual: List<myObject> [myObject { modifier = '+', name = "name", type = "string" }, myObject { modifier = '+', name = "age", type = "int" }]
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的课:
public class NumericalRange:IEquatable<NumericalRange>
{
public double LowerLimit;
public double UpperLimit;
public NumericalRange(double lower, double upper)
{
LowerLimit = lower;
UpperLimit = upper;
}
public bool DoesLieInRange(double n)
{
if (LowerLimit <= n && n <= UpperLimit)
return true;
else
return false;
}
#region IEquatable<NumericalRange> Members
public bool Equals(NumericalRange other)
{
if (Double.IsNaN(this.LowerLimit)&& Double.IsNaN(other.LowerLimit))
{
if (Double.IsNaN(this.UpperLimit) && Double.IsNaN(other.UpperLimit))
{
return true;
}
}
if (this.LowerLimit == other.LowerLimit && this.UpperLimit == other.UpperLimit)
return true;
return false;
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
该类包含一个数值范围的值.此类还应该能够保持默认范围,其中LowerLimit和UpperLimit都等于Double.NaN. …
我有一个程序,必须使用复合键管理对象.这个关键,简单就是几个字符串.
我有以下代码:
public struct MyKey
{
public string Part1 { get; set;} // always set
public string Part2 { get; set;} // can be null
public MyKey(string part1, string part2) : this()
{
this.Part1 = part1;
this.Part2 = part2;
}
}
Run Code Online (Sandbox Code Playgroud)
这对于存储我的值是可以的.
现在我希望能够:
我猜测了很多事情(覆盖等于运算符,重写GetHashCode和Equals方法,实现IComparable等),但我不确定实现目标的必要步骤是什么,以及什么会导致开销.
thx提前
我必须将一个对象与同一个类的原始属性进行比较.意思是,我必须比较那些:
struct Identifier
{
string name;
string email;
}
Run Code Online (Sandbox Code Playgroud)
用两个字符串名称和电子邮件.我知道我可以为名称和电子邮件创建一个新的Identifier实例,并将其传递给equals().我的应用程序必须非常快速且节省资源.
我知道通过哈希码进行比较不是一个好方法,因为这里解释的是冲突.但碰撞对我来说没问题,我只需要快速.
所以,
1)通过GetHashCode进行比较(检查两个对象的哈希码是否相同)比Equals()更快?
2)我是否应该为比较创建两个值的标识符的新实例,创建一个直接获取值的新方法?例如
struct Identifier {
string name;
string email;
bool Equals(string name, string email) {
// todo comparison via hashcode or equals
}
}
Run Code Online (Sandbox Code Playgroud)
c# ×9
linq ×3
c#-4.0 ×2
list ×2
.net ×1
compare ×1
comparison ×1
dictionary ×1
fxcop ×1
hash ×1
object ×1
performance ×1
unit-testing ×1
variables ×1
warnings ×1
xunit ×1