[英]How can I use IndexOf in a List<object[]>?
如果我聲明一個類似的列表,
List<object[]> People = new List<object[]>();
(其中object[]
有兩個元素)
People.Add(new object[] {"Sam", 18});
有沒有辦法可以找到這樣的人的索引?
People.IndexOf(new object[] {"Sam", 18});
我試過像上面那樣做,但它返回-1
。
通過創建一個擴展方法以我自己的糟糕方式解決了這個問題,該方法接受一個字符串參數並遍歷列表,直到它與一個匹配,然后返回該索引。
public static int OIndexOf(this List<object[]> List, string Check)
{
for (int I = 0; I < List.Count; I++)
{
if ((string)List[I][0] == Check)
return I;
}
return -1;
}
一般來說,你需要一個具體的類型來完成這項工作,比如Person
object 或int
值。
出現這種情況的原因是您的類型必須實現.Equals()
方法。 它不適用於object
對象,因為 object 的object
方法比較引用,而不是值,並且您的比較將始終返回false
除非您擁有原始object
(不是您的代碼中創建new
的情況) object 用於比較。
此方法搜索一維數組的所有元素以獲取值。 為了確定值是否存在於數組中,該方法通過調用每個元素的 Equals 方法執行相等比較,直到找到匹配項。 這意味着如果元素覆蓋 Object.Equals(Object) 方法,則調用該覆蓋。
因此,您需要一個帶有Equals()
覆蓋的Person
object。 以機智:
public class Person
{
public string Name { get; set; }
public override bool Equals(Person other)
{
return Name.Equals(other.Name);
}
}
如果你想比較一個人數組,你需要另一種封裝你的 Person 數組的類型,以及一個 Equals() 方法來檢查數組中的每個人與另一個數組中的每個人的相等性。
如果您引用了要查找的實際數組,那么IndexOf
將以您想要的方式工作。 但是您正在創建一個新數組,所以它不起作用。
做你想做的最簡單的方法是使用FindIndex
:
People.FindIndex(p => p[0] == "Sam" && p[1] == 18)
要與變量中相同索引處的整個數組進行比較,請使用 LINQ 的SequenceEqual
var arr = new object[] {"Sam", 18};
People.FindIndex(p => arr.SequenceEqual(p));
如果你真的想做,你必須自己做。
示例:新建一個 function:
int NewIndexOf(people, item)
{
int index = 0;
if(people.length) < 2
return -1;
foreach(var p in people)
{
p[0].Equals("Sam") && p[1].Equals(18)
return index;
++index;
}
return -1;
}
好吧, IndexOf
使用給定類型的默認相等比較器 - Object
,在您的情況下是 comparers references 。 您有兩個new
-兩個不同的引用,這反過來意味着兩個實例被認為是不相等的。 要解決問題,您可以:
實現您自己的 class:
public class Person : IEquatable<Person> {
public Person(string name, int age) {
if (null == name)
throw new ArgumentNullException(nameof(name));
if (age < 0)
throw new ArgumentOutOfRangeException(nameof(age));
Name = name;
Age = age;
}
public String Name {get;}
public int Age {get;}
public bool Equals(Person other) =>
other != null && other.Name == Name && other.Age == Age;
public override bool Equals(Object o) => Equals(o as Person);
public override int GetHashCode() => Name.GetHashCode() ^ Age;
}
然后你可以把
List<Person> People = new List<Person>();
People.Add(new Person("Sam", 18));
// Now .NET knows how to compare Person instances
int index = People.IndexOf(new Person("Sam", 18));
另一種方法(雖然不是一個好的做法)是在LINQ的幫助下手動查找index
:
List<object[]> People = new List<object[]>();
...
var index = People
.Select((v, i) => new { v, i })
.FirstOrDefault(pair => pair.v.SequenceEqual(new object[] { "Sam", 18 }))
?.i ?? -1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.