2012-02-24 38 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]); 
      } 

感谢大家对此的所有帮助。