我有两个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?
答案 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
的相应重载。
值得一提的代码还有两个问题:
double
,而不是AssetRecord
。您需要完全十进制值,使用框架提供的正确工具。Asset
,它可能应命名为Price
,但无论如何,不需要具有冗余信息的属性。 Date
和 ...
// HTTPS REQUEST
String data = String(1);
Particle.publish("RequestName", data, PRIVATE);
就足够了。