簡體   English   中英

如何在列表中使用 IndexOf<object[]> ?</object[]>

[英]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 用於比較。

IndexOf 方法的文檔

此方法搜索一維數組的所有元素以獲取值。 為了確定值是否存在於數組中,該方法通過調用每個元素的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM