我試圖在C#中對兩個陣列進行比較,正如之前的SO帖子中所發布的那樣:
我試圖對兩個陣列進行比較。
為什么下面的內容對我來說不起作用?
var first = Value as Array;
var second = other.Value as Array;
bool equal = first.SequenceEqual(second)。
我得到:
CS1061:'Array'不包含'SequenceEqual'的定義,并且 沒有可訪問的擴展方法'Array',接受第一個引數為 型別的擴展方法'Array'(你是否缺少一個using指令或一個匯編參考? 匯編參考?)。
我在頂部確實有正確的使用方法:
using System.Linq;
既然我可以寫(沒有編譯器錯誤):
var first = Value as string[] 。
var second = other.Value as string[] 。
bool equal = first.SequenceEqual(second)。
作為參考,我正試圖為一個通用的值型別實作Equals運算子:
public struct MyValue<T> : IEquatable<MyValue<T> >
{
public T Value { get; set; }
public bool Equals(VRValue< T> other) => throw new NotImplementedException();
uj5u.com熱心網友回復:
SequenceEqual適用于IEnumerable<T>,但是Array只實作了非通用的IEnumerable,所以SequenceEqual不適用于此。
當轉換到string[]時,你得到了不同的(型別化的)陣列型別,它完全實作了IEnumerable<T>(在這個例子中T是字串)
uj5u.com熱心網友回復:
使用@Sweeper/@Jeppe Stig Nielsen的建議,我將我的函式改寫為:
public bool Equals(VRValue< T> other)。
{
if (typeof(T).IsArray)
{
var first = Value as IStructuralEquatable;
var second = other.Value as IStructuralEquatable;
return StructuralComparisons.StructuralEqualityComparer.Equals(first, second)。
}
[...]
}
當使用HashSet時,還應該注意GetHashCode:
public override int GetHashCode()
{
if (typeof(T).IsArray)
{
var first = Value as IStructuralEquatable;
return StructuralComparisons.StructuralEqualityComparer.GetHashCode(first)。
}
[...]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/310068.html
標籤:
