两个字典交集C#

时间:2018-01-01 22:33:21

标签: c#

我有两个DateTime列表并且没有任何问题相交:

IEnumerable<DateTime> both = list1.Intersect(list2);

我有自定义数据类型,仍然需要找到交叉点:

public class AssetRecord
{
    // Custom data type. Each object has time and price
    public DateTime AssetDate { get; set; } 
    public double AssetPrice { get; set; }
}

// Lits initialization
public static List<AssetRecord> list1 = new List<AssetRecord> { }; 
// Key/Values - Date/Price. Custom data type is used to store an object in the collection
public static List<AssetRecord> list2 = new List<AssetRecord> { }; 

问题是IEnumerable只将DataTime列表作为输入,我不再拥有该数据类型。是否可以使用自定义类型找到交集?或者是否可以从创建的数据类型中仅采用Date字段并将其转换为List然后将其传递给IEnumerable?

1 个答案:

答案 0 :(得分:2)

  

问题是IEnumerable只接受DataTime列表

咦?这是没有意义的。 IEnumerable<T>采用您选择的T。在这种情况下,IEnumerable<AssetRecord>将包含AssetRecord s。

现在,这不是你的主要问题。你的问题是交叉如何工作。 Enumerable.Intersect<T>采用默认的T相等。那么,AssetRecord的默认相等比较器是什么?引用相等,您可能需要值相等语义。

解决方案?相应地覆盖Equals中的AssetRecord,同时覆盖IEquatable<AssetRecord>,同时执行GetHashCode(并且不要忘记以一致的行为覆盖public class AssetRecord: //IEquatable<AssetRecord> left as exercise { // Custom data type. Each object has time and price public DateTime AssetDate { get; set; } public decimal AssetPrice { get; set; } public override bool Equals(object other) { if (other is AssetRecord) { var ass = (AssetRecord)other; return ass.AssetDate == AssetDate && ass.AssetPrice == AssetPrice; } return false; } public override int GetHashCode() { return AssetDate.GetHashCode() ^ AssetPrice.GetHashCode(); } } ):

AssetRecord

如果您无法触摸IEqualityComparer<AssetRecord>,请执行Intersect并使用decimal的相应重载。

值得一提的代码还有两个问题:

  1. 价格应为double,而不是AssetRecord。您需要完全十进制值,使用框架提供的正确工具。
  2. 您的类型已命名为Asset,它可能应命名为Price,但无论如何,不​​需要具有冗余信息的属性。 Date ... // HTTPS REQUEST String data = String(1); Particle.publish("RequestName", data, PRIVATE); 就足够了。