Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅使用一个列表_C#_List_Polymorphism - Fatal编程技术网

C# 如何仅使用一个列表

C# 如何仅使用一个列表,c#,list,polymorphism,C#,List,Polymorphism,嘿,所以我需要设计一个程序,可以将公司的提货或送货添加到我的课程列表中,我已经制作了一个名为访问的列表,如下所示 我想知道如何将每个收货或发货添加到列表中,以便能够区分最初的收货或发货,以便仅显示收货或发货 class List { /* * This object represents the List. It has a 1:M relationship with the Visit class */ private List<Visits> visits = ne

嘿,所以我需要设计一个程序,可以将公司的提货或送货添加到我的课程列表中,我已经制作了一个名为访问的列表,如下所示

我想知道如何将每个收货或发货添加到列表中,以便能够区分最初的收货或发货,以便仅显示收货或发货

class List
{
/*
 * This object represents the List. It has a 1:M relationship with the Visit class
 */

    private List<Visits> visits = new List<Visits>();
    //List object use to implement the relationshio with Visits

    public void addVisits(Visits vis)
    {
        //Add a new Visit to the List
        visits.Add(vis);
    }

    public List<String> listVisits()
    {//Generate a list of String objects, each one of which represents a Visit in List.

        List<String> listVisits = new List<string>();
        //This list object will be populated with Strings representing the Visits in the lists

        foreach (Visits vis in visits)
        {
            String visAsString = vis.ToString();
            //Get a string representing the current visit object

            listVisits.Add(visAsString);
            //Add the visit object to the List
        }

        return listVisits;
        //Return the list of strings
    }

    public Visits getVisits(int index)
    {
        //Return the visit object at the <index> place in the list

        int count = 0;
        foreach (Visits vis in visits)
        {
            //Go through all the visit objects
            if (index == count)
                //If we're at the correct point in the list...
                return vis;
            //exit this method and return the current visit
            count++;
            //Keep counting
        }
        return null;
        //Return null if an index was entered that could not be found
    }
类列表
{
/*
*此对象表示列表。它与访问类有1:M关系
*/
私人列表访问=新列表();
//列出用于实现与访问的关系的对象
公众访问(访问vis)
{
//将新访问添加到列表中
访问。添加(vis);
}
公众名单访问次数()
{//生成字符串对象的列表,每个对象表示列表中的访问。
列表访问次数=新列表();
//此列表对象将填充表示列表中访问的字符串
foreach(访问中的访问)
{
字符串visassString=vis.ToString();
//获取表示当前访问对象的字符串
添加(visAsString);
//将访问对象添加到列表中
}
回访;
//返回字符串列表
}
公众访问量(int索引)
{
//在列表中的位置返回访问对象
整数计数=0;
foreach(访问中的访问)
{
//浏览所有访问对象
如果(索引==计数)
//如果我们在列表中的正确位置。。。
返回vis;
//退出此方法并返回当前访问
计数++;
//数一数
}
返回null;
//如果输入了找不到的索引,则返回null
}
显示代码

       /*
         * Update the list on this form the reflect the visits in the list
         */
        lstVisits.Items.Clear();
        //Clear all the existing visits from the list

        List<String> listOfVis = theList.listVisits();
        //Get a list of strings to display in the list box


        lstVisits.Items.AddRange(listOfVis.ToArray());
        //Add the strings to the listBox. Note to add a list of strings in one go we have to 
        //use AddRange and we have to use the ToArray() method of the list that we are adding
/*
*更新此表单上的列表,以反映列表中的访问
*/
lst.Items.Clear();
//从列表中清除所有现有访问
List listOfVis=theList.listVisits();
//获取要在列表框中显示的字符串列表
lstVisites.Items.AddRange(listOfVis.ToArray());
//将字符串添加到列表框。注意:要一次性添加字符串列表,我们必须
//使用AddRange,我们必须使用要添加的列表的ToArray()方法

在Visitions类中添加一个参数,用于跟踪它是拾取还是传递,并在Visits类中添加一个getType()/setType()方法来检索它是哪种类型

看起来您继承了一个名为
Visits
的公共类

更改
访问
以提供区分访问类型的方法,例如:

enum VisitKind {
    Pickup,
    Delivery
}

public class Visits {
    public VisitKind KindOfVisit {get;private set;}
    protected Visits(VisitKind kind) {
        KindOfVisit = kind;
    }
}
public class Pickup : Visits {
    public Pickup() : base(VisitKind.Pickup) {}
}
public class Delivery : Visits {
    public Delivery() : base(VisitKind.Delivery) {}
}
现在修改
Pickup
Delivery
的构造函数,将正确的类型传递给其超类的构造函数,如下所示:

enum VisitKind {
    Pickup,
    Delivery
}

public class Visits {
    public VisitKind KindOfVisit {get;private set;}
    protected Visits(VisitKind kind) {
        KindOfVisit = kind;
    }
}
public class Pickup : Visits {
    public Pickup() : base(VisitKind.Pickup) {}
}
public class Delivery : Visits {
    public Delivery() : base(VisitKind.Delivery) {}
}
现在,您可以检查
KindOfVisit
属性,该属性与
Pickup
Delivery
通用,以确定运行时的访问类型:

public IList<Delivery> GetDeliveries() {
    var res = new List<Delivery>();
    foreach (var v in visits) {
        if (v.KindOfVisit == VisitKind.Delivery) {
            res.Add((Delivery)v);
        }
    }
    return res;
}
public IList GetDeliveries(){
var res=新列表();
foreach(访问中的var v){
如果(v.KindOfVisit==VisitKind.Delivery){
决议添加((交付)v);
}
}
返回res;
}
这种解决方案并不理想,因为当有人添加一种新的访问时,处理访问的代码会像往常一样继续编译。不过,解决这个问题的方法要比添加属性困难得多:一种解决方案是使用比简单的
kind
属性更好的属性,但它有自己的局限性



*用名词的复数来命名一个类是很不传统的-
Visit
可能会是一个更好的名称。

通常你会有两个列表,一个用于提货,一个用于送货。只有当你不需要区分不同类型的访问时,才有一个“访问”列表才有意义(也就是说,即使方法在每个具体类型中有不同的(多态)实现,您也只会接触Visit类中的内容).好的,在这种情况下,我有一个按钮用于发货,另一个按钮用于收货,将它们添加到列表框中以显示摘要…如果“仅显示收货”按钮或“仅发货”按钮为空,我如何实现一个按钮来对它们进行排序,但使用上面的代码,我如何显示“仅显示收货”列表?我真的不明白part@TAM你找到a了吗回答评论中的问题?没有,但我会将我当前的节目代码添加到我的原始帖子中,然后它会像.visitkind=delivery或其他什么吗?@TAM我编辑了答案,以显示一个过滤列表以仅包含交付的示例。