0

我有一门叫本科生的班级,它记录学生的名字和姓氏。我希望每个对象都有一个索引。在我的程序课上,我创建了一个List<>本科生。我将如何设置它,以便列表中的每个对象都有一个唯一的标识号,它在程序类中会是什么样子?

public class Undergrad
{
     String fName, lName;

     public Undergrad()
     {
     }

     public Undergrad(string firstName, string lastName)
     {
         this.fName = firstName;
         this.lName = lastName;           
     }
}
4

5 回答 5

5

您需要向该类添加一个属性来存储该索引以供初学者使用。这可以是整数或 UniqueIdentifer。

如果您使用整数,您将需要其他地方(例如数据库)来存储所有索引,以便您的应用程序知道从哪里获取下一个值。

使用 UniqueIdentifer (System.Guid) 您不会遇到重复的冲突,因此您可以直接创建该内联。

选项1

public class Undergrad
{
     String fName, lName;
     public Guid UniqueId {get; set; }

     public Undergrad()
     {
          UniqueId = System.Guid.NewGuid();
     }

     public Undergrad(string firstName, string lastName)
     {   
         UniqueId = System.Guid.NewGuid();
         this.fName = firstName;
         this.lName = lastName;           
     }
}

选项 2

public class Undergrad
{
     String fName, lName;
     public int UniqueId {get; set; }

     public Undergrad()
     {
          UniqueId = //LoadFromDatabase();
     }

     public Undergrad(string firstName, string lastName)
     {   
         UniqueId = //LoadFromDatabase();
         this.fName = firstName;
         this.lName = lastName;           
     }
}

你目前在哪里存储你的本科信息?如果它已经在数据库中,我希望您已经在对象上有一个 id 字段。

最后一件事,当您将这些放入 aList<T>时,列表将拥有自己的索引(用于列表中的位置),这是一个单独的概念。

于 2013-07-05T07:54:38.260 回答
2

您可以static为班级添加唯一 ID。

public class Undergrad
{
     String fName, lName;
     private static int _uniqueID;   
     private int _myUniqueID;

     public Undergrad() : this(string.Empty, string.Empty)
     {

     }

     public Undergrad(string firstName, string lastName) 
     {
         this.fName = firstName;
         this.lName = lastName;          

         _uniqueID += 1; 
         _myUniqueID = _uniqueID;
     }

    public int UniqueID { get { return _myUniqueID; } }
}
于 2013-07-05T07:54:51.627 回答
1

不确定这是否是您要查找的内容,但是:

您可以创建一个包含 Undergrad 列表的对象,例如添加一个枚举类 EUndergrad 并添加将返回您正在寻找的实例的索引方法。

public class Undergrads
{
    private List<Undergrad> myList;

    public Undergrad this[EUndergrad index]
    {
        return this.myList[index];
    }
}

public enum EUndergrad
{
    Undergrad_0 = 0,
    Undergrad_1 = 1,
    ...
}

你可以通过调用来检索你的本科对象

instanceOfUndergrads[EUndergrad.Undergrad_0]
于 2013-07-05T07:59:33.000 回答
1

维护您的列表查找并分配一个唯一的 id/guid 作为该查找的键

    public class Undergrad
    {
        String fName, lName;

        public Undergrad()
        {
        }

        public Undergrad(string firstName, string lastName)
        {
            this.fName = firstName;
            this.lName = lastName;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Undergrad> lstGraduates = new List<Undergrad>() { new Undergrad("f1", "l1"), new Undergrad("f2", "l2"), new Undergrad("f3", "l3") };
            int i = 0;
            ILookup<int, Undergrad> lookup = lstGraduates.ToLookup(p => i++);

            foreach (IGrouping<int, Undergrad> packageGroup in lookup)
            {
                Console.WriteLine(packageGroup.Key);
                Undergrad obj = (Undergrad)packageGroup;                
            }
            Console.Read();
        }
    }
于 2013-07-05T08:08:17.953 回答
1

感谢在 .Net 中生成唯一密钥

您可以包含提供唯一键的 KeyGenerator。

public class Undergrad
{
    public string Id { get; private set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Undergrad()
    {
        Id = KeyGenerator.GetUniqueKey();
    }

    public Undergrad(string firstName, string lastName)
        : this()
    {
        FirstName = firstName;
        LastName = lastName;
    }
}

public static class KeyGenerator
{
    public static string GetUniqueKey()
    {
        int maxSize = 8;
        int minSize = 5;
        var chars = new char[62];
        string a;
        a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        chars = a.ToCharArray();
        int size = maxSize;
        var data = new byte[1];
        var crypto = new RNGCryptoServiceProvider();
        crypto.GetNonZeroBytes(data);
        size = maxSize;
        data = new byte[size];
        crypto.GetNonZeroBytes(data);
        var result = new StringBuilder(size);
        foreach (byte b in data)
        {
            result.Append(chars[b%(chars.Length - 1)]);
        }
        return result.ToString();
    }

测试:

internal class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine((new Undergrad()).Id);
        Console.WriteLine((new Undergrad()).Id);
        Console.WriteLine((new Undergrad()).Id);
    }
}

产生:

    QdfQcGuV
    5MtEBtev
    AXwseCmJ
于 2013-07-05T08:30:04.613 回答