C# 创建和使用自定义列表<;T>;在C中#
我正在尝试使用自定义列表,因为我添加了一些其他工具。我想将此列表应用于我创建的一长串自定义类。所有类都有一个ID号,列表中的一些工具使用该ID 这是我试图使用的代码的一部分。我希望这能帮助你理解我的问题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() {
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; }
}