C#从基于索引的列表中返回一个对象
本文关键字:列表 返回 一个对象 索引 于索引 | 更新日期: 2023-09-27 18:25:45
我需要做一些更改,以便一次只从列表中检索一个对象,而不是像现在这样检索整个列表。
现在我在B类中得到了一个私有列表,其中一个属性返回了整个列表,基本上是公开的,我想改变这一点。
类a的外观(使用列表操作的ui类)是,我输入一些数据来验证它,并将它发送到类B,然后类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中返回整个列表的方法。
问题是,这些属性是所有类共享的常见属性,还有一些属性不是,比如一个文本框,你可以输入关于对象的特定文本等等,它显示为:
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;
}
}
}
}
现在这一切都很好,但现在我有一个返回的列表要操作,但我不想将列表公开,我想根据索引号返回列表中的一个对象(是的,功能完全相同,我做了一个返回私有列表计数的方法,这样我就可以循环它并返回所有)。这是为了在我不想退货的时候练习OOP。
如何做到这一点?我所能想到的就是制作一个新的列表,以int作为输入,搜索我的私人列表并找到索引,然后将其添加到另一个列表并返回该列表,但我不知道这是一个好的做法还是最好的方法?好吧,我也没有研究如何将一个元素"复制"到下一个列表中,但不妨检查一下,看看是否有更好的方法来做事情?
只是感觉我"绕了很长一段路"这样
不一定能理解,但一个简单的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);
我不确定我是否完全理解,但听起来你可以通过在类B上创建一个索引器来返回你想要的项目来解决这个问题:
public object this[int index] {
get {
return list[index];
}
}
将"object"更改为您的类类型。
然后,您可以访问这些项目,就好像类B是一个数组一样:
object item = classB[5];
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;
做了与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]);
}
感谢大家在这方面的帮助。