2012-02-24 49 views
0

我需要進行一些更改,以便我只從列表中檢索一個對象,而不是像我現在這樣從整個列表中檢索一個對象。C#從基於索引的列表返回對象

現在我得到了一個在B類私人列表與屬性返回整個列表基本上公開無論如何,我想改變這一點。

類a的外觀(ui類與列表一起運行)的方式是,我輸入一些數據來驗證它,並將它發送給B類,然後將它打包到基於輸入的對象列表中。

那麼類A需要循環該列表並將其添加到列表視圖顯示它看起來像這樣的時刻:

ListViewItem lvi = new ListViewItem(); 
     foreach ([Object] o in CLassB.getList()) 
     { 
      lvi = new ListViewItem(o.property0); 
      lvi.SubItems.Add(o.property1); 
      lvi.SubItems.Add(o.property2); 
      lvi.SubItems.Add(o.property3); 
     } 
    } 

對象是我控制的不同類型的項目是如何抽象類添加和getList()是我的方法在類B返回整個列表。

的事情是這些propertys是一些通用的所有類共享也有一些的arent,就像一個文本框,你輸入有關對象等,這些特定的文本顯示是這樣的:

private void lvRegistered_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 
    { 
     if (Listview.SelectedItems.Count > 0) 
     { 
      foreach ([Object] ob in ClassB.getList()) 
      { 
       if (Listview.SelectedItems[0].SubItems[0].Text == ob.id.ToString()) 
       { 
        TextBox.Clear(); 
        TextBox.Text = ob.property4; 
       } 
      } 
     } 
    } 

現在這一切都很好,但現在我有一個返回的列表來操作,但我不想返回列表使其公開我想要返回一個基於索引號的列表對象(是的,功能將是完全正確的同樣,我做了一個方法返回私人列表的計數,所以我可以循環它,並返回所有)。這是爲了當我不想要返回所有東西時練習面向對象的。

這將如何完成?我所能想到的只是創建一個新列表,以int爲輸入並搜索我的私人列表並找到索引,然後將其添加到另一個列表並返回該列表,但我不知道這是好的做法還是最好的方法去做吧?那麼我還沒有研究過如何將一個元素「複製」到下一個列表中,但是也可以檢查一下,看看是否有更好的方法來做事情?

剛剛得到的感覺是IM「採取繞很長的路」這樣

+1

因此,只暴露'ClassB.GetItemByIndex(int index)'而不是'ClassB.getList()',或者你的問題是什麼? – sll 2012-02-24 13:46:25

+0

您可以使用list.AsReadOnly()方法(http://goo.gl/Ue1kA)。 – Makah 2012-02-24 13:46:54

回答

3

不知道理解的,但如何對一個簡單的方法GetById

public class Foo 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

public class Test 
{ 
    private List<Foo> list = new List<Foo>(); 

    public void Add(Foo foo) 
    { 
     this.list.Add(foo); 
    } 

    public Foo GetById(int id) 
    { 
     return this.list.FirstOrDefault(z => z.Id == id); 
    } 
} 

.... 

Test test = new Test(); 
test.Add(new Foo { Id = 1, Name = "1" }); 
test.Add(new Foo { Id = 2, Name = "2" }); 
test.Add(new Foo { Id = 3, Name = "3" }); 

Foo foo2 = test.GetById(2); 
+0

是的,看起來它會工作,已經有一個ID。只有我看到的概率是我序列化和反序列化我的列表,所以如果我要刪除id 3例如我可以做一個forloop從1開始,並尋找id的列表的計數,將不得不解決這個問題。 – Gvs 2012-02-24 14:57:45

2

我不知道我完全理解,但它聽起來像是你可以解決這個要創建B類的索引器返回的項目你想:

public object this[int index] { 
    get { 
    return list[index]; 
    } 
} 

變化「對象」到任何你的類類型實際上是。

然後,您可以訪問項目,如同B類是一個數組:

object item = classB[5]; 
1

1)您可以使用List.AsReadOnly()方法。

public ReadOnlyCollection<Double> MyList { 
     get { 
      return myList.AsReadOnly(); 
     } 
} 
private List<Double> myList; 

2)在類中使用索引方法。

public Double this[int index] { 
     get { 
      return myList[index]; 
     } 
     set { 
      myList[index] = value; 
     } 
} 
private List<Double> myList; 
+1

asreadonly的問題是它仍然返回整個列表的權利?關鍵是要讓(即使對於這個特定的任務我想返回everyhting)列表回顧我允許它,說我存儲敏感數據或某事,然後每個人不能訪問列表中的所有內容只是由指定的數據搜索。 – Gvs 2012-02-24 14:16:40

0

難道大約相同的Ken2k的建議,而是我這個去:

public [Class] getListItem(int index) 
    { 
     return myList.ElementAt(id); 
    } 

該消息又在顯示類的信息我的其他類用於:

for (int i = 0; i < am.getCount(); i++) 
      { 
       ListViewItem = new ListViewItem([class reference].getList(i).[property].ToString()); 
       ListViewItems.SubItems.Add([class reference].getList(i).[property]); 
      } 

感謝大家對此的所有幫助。