C#根据索引从列表中返回一个对象

时间:2012-02-24 13:41:35

标签: c# list

我需要进行一些更改,以便我只能从列表中一次检索一个对象而不是像现在一样检索整个列表。

现在我已经在B级获得了一个私人列表,其中一个属性返回整个列表,基本上将其公之于众,我想改变它。

类a看起来的方式(使用列表操作的ui类)是,我输入一些数据验证它并将其发送到B类,然后B类根据输入将其打包成对象列表。

然后A类需要循环这个列表并将其添加到listview中以显示它,如下所示:

    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);
        }
    }

Object是我的抽象类,它控制如何添加不同类型的项,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作为输入并搜索我的私人列表并找到索引然后将其添加到另一个列表并返回该列表,但我不知道这是好的做法还是最好的方法去做吧?好吧,我还没有调查过如何将一个元素“复制”到下一个列表中,但也可以检查并查看是否有更好的方法来做事情?

通过这种方式让我感觉“走了很长一段路”

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

我不确定我完全理解,但听起来你可以解决这个问题,就是在B级创建一个索引器来返回你想要的项目:

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

将“对象”更改为您的班级类型实际上是什么。

然后,您可以访问这些项目,就像B类是一个数组一样:

object item = classB[5];

答案 2 :(得分: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;

答案 3 :(得分: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]);
            }

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