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作为输入,搜索我的私人列表并找到索引,然后将其添加到另一个列表并返回该列表,但我不知道这是一个好的做法还是最好的方法?好吧,我也没有研究如何将一个元素"复制"到下一个列表中,但不妨检查一下,看看是否有更好的方法来做事情?

只是感觉我"绕了很长一段路"这样

C#从基于索引的列表中返回一个对象

不一定能理解,但一个简单的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]);
            }

感谢大家在这方面的帮助。