Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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# 创建和使用自定义列表<;T>;在C中#_C#_List_Class_Generics - Fatal编程技术网

C# 创建和使用自定义列表<;T>;在C中#

C# 创建和使用自定义列表<;T>;在C中#,c#,list,class,generics,C#,List,Class,Generics,我正在尝试使用自定义列表,因为我添加了一些其他工具。我想将此列表应用于我创建的一长串自定义类。所有类都有一个ID号,列表中的一些工具使用该ID 这是我试图使用的代码的一部分。我希望这能帮助你理解我的问题 namespace Simple_Point_of _Sales_System { public class MyList<T> : List<T> { internal int SetID() {

我正在尝试使用自定义列表,因为我添加了一些其他工具。我想将此列表应用于我创建的一长串自定义类。所有类都有一个ID号,列表中的一些工具使用该ID

这是我试图使用的代码的一部分。我希望这能帮助你理解我的问题

namespace Simple_Point_of _Sales_System
{
    public class MyList<T> : List<T>
    {
        internal int SetID()
        {
            return this.Max(n => n.ID) + 1;
        }
        internal T Find(int ID)
        {
            return this.Find(n => n.ID == ID);
        }
        internal T Add(T n)
        {
            Read();
            Add(n);
            Write();
            return n;
        }
        internal void Remove(int ID)
        {
            Read();
            if (this.Exists(t => t.ID == ID)) RemoveAll(t => t.ID == ID);
            else MessageBox.Show(GetType().Name + " " + ID + " does not exist.", "Missing Item", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Write();
        }
        internal void Edit(int ID, T n)
        {
            Read();
            if (this.Exists(t => t.ID == ID)) this[FindIndex(t => t.ID == ID)] = n;
            else MessageBox.Show(GetType().Name + " " + ID + " does not exist.", "Missing Item", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Write();
        }
        internal MyList<T> Read()
        {
            Clear();
            StreamReader sr = new StreamReader(@"../../Files/" + GetType().Name + ".txt");
            while (!sr.EndOfStream)
                Add(new T().Set(sr.ReadLine()));
            sr.Close();
            return this;
        }
        internal void Write()
        {
            StreamWriter sw = new StreamWriter(@"../../Files/" + GetType().Name + ".txt");
            foreach (T n in this)
                sw.WriteLine(n.ToString());
            sw.Close();
        }
    }

    public class Customer
    {
        public int ID;
        public string FirstName;
        public string LastName;
    }

    public class Item
    {
        public int ID { get; set; }
        public string Category { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
    }

    public class MyClass
    {
        MyList<Customer> Customers = new MyList<Customer>();
        MyList<Item> Items = new MyList<Item>();
    }
}
销售系统的名称空间简单点 { 公共类MyList:列表 { 内部int SetID() { 返回这个.Max(n=>n.ID)+1; } 内部T查找(内部ID) { 返回this.Find(n=>n.ID==ID); } 内部T添加(T n) { Read(); 添加(n); Write(); 返回n; } 内部无效删除(内部ID) { Read(); 如果(this.Exists(t=>t.ID==ID))RemoveAll(t=>t.ID==ID); else MessageBox.Show(GetType().Name+“”+ID+“不存在。”,“缺少项”,MessageBoxButtons.OK,MessageBoxIcon.Error); Write(); } 内部无效编辑(内部ID,T n) { Read(); 如果(this.Exists(t=>t.ID==ID))这个[FindIndex(t=>t.ID==ID)]=n; else MessageBox.Show(GetType().Name+“”+ID+“不存在。”,“缺少项”,MessageBoxButtons.OK,MessageBoxIcon.Error); Write(); } 内部MyList Read() { 清除(); StreamReader sr=新的StreamReader(@./../Files/“+GetType().Name+.txt”); 而(!sr.EndOfStream) 添加(新的T().Set(sr.ReadLine()); 高级关闭(); 归还这个; } 内部无效写入() { StreamWriter sw=newstreamwriter(@./../Files/“+GetType().Name+.txt”); foreach(在本例中为tn) sw.WriteLine(n.ToString()); sw.Close(); } } 公共类客户 { 公共int ID; 公共字符串名; 公共字符串LastName; } 公共类项目 { 公共int ID{get;set;} 公共字符串类别{get;set;} 公共字符串名称{get;set;} 公共双价{get;set;} } 公共类MyClass { MyList客户=新建MyList(); MyList Items=新建MyList(); } }
我认为您的自定义列表需要对泛型类型进行一些限制,以允许这样做。我会把你的签名更新为

public class MyList<T> : List<T> where T : IIdentity { .... }

我将
Customer
中的ID更改为属性而不是实例变量。

既然您的自定义列表只处理房间,为什么不创建房间:列表呢?您应该对
t
使用约束,所以您确保只允许具有
ID
-字段或属性的类。如果无法继承,请创建一个接口来强制执行此操作。但你到底想知道什么?
public interface IIdentity
{
    int ID { get; }
}

public class Customer : IIdentity
{
    public int ID { get; set;}
    public string FirstName;
    public string LastName;
}

public class Item : IIdentity
{
    public int ID { get; set; }
    public string Category { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }
}