2016-11-25 66 views
1

我編寫了這段代碼來檢查Collection以找到具有相同值的對象,但它返回索引-1並導致IndexOutOfRangeException。任何人都可以找到我的錯誤嗎?C#ObservableCollection.IndexOf(...)返回-1

List<MyFileInfo> selectedItemsList = dataInbox.SelectedItems.Cast<MyFileInfo>().ToList(); 
foreach (MyFileInfo file in selectedItemsList) 
{ 
    if (!file.AdditionalColumn.Equals("")) 
    { 
     inDB = new ZeichnungInDB(file.FileInfo.Name, file.AdditionalColumn, file.AdditionalColumn2, file.FileInfo.Extension, 
     txtAenderungExtern.Text, file.AdditionalColumn3, 
     int.Parse(txtProjectNumber.Text), txtTag.Text, bemerkung, anhangPfad, cmbDokumententyp.Text, false); 
     if (zeichnungCollection.Count > 0) 
     { 
      if (zeichnungCollection[zeichnungCollection.IndexOf(inDB)].Zeichnungsnummer != inDB.Zeichnungsnummer && 
      zeichnungCollection[zeichnungCollection.IndexOf(inDB)].Extension != inDB.Extension) 
      { 
       zeichnungCollection.Add(inDB); 
      } 
      else 
      { 
       sameData = true; 
      } 
     } 
     else 
     { 
      zeichnungCollection.Add(inDB); 
     } 
    } 
} 
+0

在代碼格式化:縮進你的整個街區,使最外層具有縮進的四個空格,你應該是好的。 –

回答

1

您創建了一個對象的新實例,你再試圖找到對象,其中您的收藏實際持有引用不同的實例的指數。

您可以使用FindIndexToList傳入謂詞並找到條件爲true的對象的索引。 https://msdn.microsoft.com/en-us/library/x1xzf2ca(v=vs.110).aspx

或者,你可以使用FirstOrDefault一些空檢查,如果你希望保留它作爲一個ObservableCollection https://msdn.microsoft.com/en-us/library/bb340482(v=vs.110).aspx

+0

嗯,我沒有FindIndex方法。 – Only3lue

+0

'zeichnungCollection.ToList()。FindIndex(Predicate)' – ColinM

+0

Okey,謝謝! – Only3lue

1

假設MyFileInfo看起來是這樣的:

public class MyFileInfo 
{ 
    public string Name { get; set; } 
} 

現在嘗試使用它是這樣的:

List<MyFileInfo> selectedItemsList = new List<MyFileInfo> 
    { 
     new MyFileInfo { Name = "One" }, 
     new MyFileInfo { Name = "Two" }, 
    }; 

MyFileInfo two = new MyFileInfo { Name = "Two" }; 
int index = selectedItemsList.IndexOf(two); // index == -1 

IndexOf正在查找相同的實例引用,它沒有找到,因此返回-1。

如果你這樣做,而不是,不過,引用是相同的:

MyFileInfo two = new MyFileInfo { Name = "Two" }; 
List<MyFileInfo> selectedItemsList = new List<MyFileInfo> 
    { 
     new MyFileInfo { Name = "One" }, 
     two, 
    }; 

int index = selectedItemsList.IndexOf(two); // index == 1 

這是由於Equals方法,剛剛比較了參考相等的默認實現。如果您在MyFileInfo中覆蓋Equals,則可以決定Equals的含義。例如:

public class MyFileInfo 
{ 
    public string Name { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (obj?.GetType() == typeof(MyFileInfo)) 
     { 
      return ((MyFileInfo)obj).Name == Name; 
     } 

     return false; 
    } 
} 

這會找到與Name相同的任意對象。

使用與謂詞方法是另一種選擇,它允許你定義什麼Equals意味着對飛,例如:

List<MyFileInfo> selectedItemsList = new List<MyFileInfo> 
    { 
     new MyFileInfo { Name = "One" }, 
     new MyFileInfo { Name = "Two" }, 
    }; 

MyFileInfo two = new MyFileInfo { Name = "Two" }; 
int index = selectedItemsList.FindIndex(info => info.Name == two.Name); 

其中也發現有同樣的Name項目。

注意:如果您在可能被用來作爲一個字典(哈希表)密鑰的任何類中重寫Equals,你也應該重寫GetHashCodeHere's a discussion。還有一些需要考慮的其他接口,比如IEquatable<T>,尤其是struct(值對象),我猜這個問題已經超出了範圍。

編輯Why it's important to override GetHashCode when overriding Equals

+0

嗯,這個解決方案看起來也很有趣。也許我會在週末之後檢查一下,如果我能爲我的問題做好這項工作。 – Only3lue