相关疑难解决方法(0)

我可以使用LINQ检查列表中的对象是否具有唯一ID吗?

说我有一个包含这样的对象的列表:

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# linq list object

6
推荐指数
2
解决办法
2724
查看次数

覆盖C#中的Object.Equals()实例方法; 现在代码分析/ FxCop警告CA2218:"还应该重新定义GetHashCode".我该抑制吗?

我在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()会更合理吗?


更新:我只是在比尔瓦格纳的好书" 有效C#"中重新审视了这个主题,他在"第10项:了解GetHashCode()的陷阱"中说:

如果您定义的类型不会被用作容器中的键,那么这无关紧要.表示窗口控件,网页控件或数据库连接的类型不太可能用作集合中的键.在那些情况下,什么都不做.即使效率非常低,所有引用类型都将具有正确的哈希码.[...]在您创建的大多数类型中,最好的方法是完全避免GetHashCode()的存在.

...这就是我最初得到这个想法的地方,我不必总是关注GetHashCode().

c# warnings fxcop suppress-warnings

5
推荐指数
4
解决办法
1126
查看次数

合并2个列表并删除重复项.在第三个列表中输出.我的尝试不起作用

当我需要比较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)

linq

5
推荐指数
2
解决办法
2万
查看次数

LINQ Except()方法不起作用

我有2 IList<T>个相同类型的对象ItemsDTO.我想从另一个列表中排除一个列表.然而,这对我来说似乎没有用,我想知道为什么?

IList<ItemsDTO> related = itemsbl.GetRelatedItems();
IList<ItemsDTO> relating = itemsbl.GetRelatingItems().Except(related).ToList();
Run Code Online (Sandbox Code Playgroud)

我正在尝试relatedrelating列表中删除项目.

c# linq linq-to-objects

5
推荐指数
1
解决办法
5778
查看次数

GetHashCode()与^

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)

c# c#-4.0

5
推荐指数
2
解决办法
2908
查看次数

根据对象的某些属性创建唯一的哈希码

我必须遵循以下课程:

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)

用户想要填充 …

c# hash compare

5
推荐指数
1
解决办法
7306
查看次数

如何使用 xunit test 比较两个列表

我目前正在尝试使用 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)

c# unit-testing list xunit

5
推荐指数
1
解决办法
4175
查看次数

关于字典<T,T>的问题

我有一个看起来像这样的课:

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. …

.net c# dictionary

4
推荐指数
2
解决办法
408
查看次数

"复合"变量类型的正确实现是什么?

我有一个程序,必须使用复合键管理对象.这个关键,简单就是几个字符串.

我有以下代码:

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)

这对于存储我的值是可以的.

现在我希望能够:

  • 使用equals运算符(part1和part2是等于)
  • 使用Dictionnary中的键,尤其是使用Contains方法

我猜测了很多事情(覆盖等于运算符,重写GetHashCode和Equals方法,实现IComparable等),但我不确定实现目标的必要步骤是什么,以及什么会导致开销.

thx提前

c# variables c#-4.0

4
推荐指数
1
解决办法
238
查看次数

通过Equals或HashCode进行比较.哪个更快?

我必须将一个对象与同一个类的原始属性进行比较.意思是,我必须比较那些:

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)

我会使用resharper生成的Equals()和GetHashCode()方法.

c# comparison performance

4
推荐指数
2
解决办法
5794
查看次数