【问题标题】:c# How to call a List from another Classc#如何调用另一个类的列表
【发布时间】:2021-09-14 23:15:17
【问题描述】:

我对 c# 有点陌生,正在尝试制作电话簿控制台应用程序。需要一些帮助来弄清楚如何从另一个类调用列表。要理解我的代码:我有一个包含列表的类(ContactsList)。然后我有另一个类(AppOptions),它有一些用户可以选择的选项,一个是 ViewAllContacts。所以我需要知道我需要在 ViewAllContacts 方法中编写什么代码,以及是否需要在其他任何地方进行任何其他更改。

public class ContactsList
    {
        public string contactName { get; set; }
        public int contactNumber { get; set; }

        public void listMethod()
        {
            List<ContactsList> contacts = new List<ContactsList>();
            {
                contacts.Add(new ContactsList { contactName = "John", contactNumber = 01 });
                contacts.Add(new ContactsList { contactName = "Jack", contactNumber = 02 });
                contacts.Add(new ContactsList { contactName = "Jay", contactNumber = 03 });
            }
        }
    }

 class AppOptions
    {
        ContactsList contactList = new ContactsList();
        public void viewAllContacts()
        {
           
        }
    }

非常感谢我的代码的任何额外改进。谢谢!

编辑:我想要的另一件重要事情是使用 ViewAllContacts 方法遍历列表

【问题讨论】:

  • 类是引用类型,引用可以共享。妙语...分享参考。
  • 我在谷歌上搜索了一些东西以方便您docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
  • 你应该有一个新的类Contact并且类ContactList有一个公共属性List&lt;Contact&gt; AllContacts。然后,如果您有 ContactList 类的实例,则可以访问此列表。您可以传递此实例,以便将其保存在 AppOptions 中并将其存储在一个字段中。然后很容易枚举viewAllContacts中的联系人:foreach(Contact c in _contactList.AllContacts{ ... }

标签: c# list


【解决方案1】:

你应该试试下面的代码。

public class ContactsList
    {
        public string contactName { get; set; }
        public int contactNumber { get; set; }

        public IList<ContactsList> listMethod()
        {
            List<ContactsList> contacts = new List<ContactsList>();
            {
                contacts.Add(new ContactsList { contactName = "John", contactNumber = 01 });
                contacts.Add(new ContactsList { contactName = "Jack", contactNumber = 02 });
                contacts.Add(new ContactsList { contactName = "Jay", contactNumber = 03 });
            }

            return contacts;
        }
    }

    class AppOptions
    {
        ContactsList contactList = new ContactsList();
        public void viewAllContacts()
        {
            var lst = contactList.listMethod();
        }
    }

【讨论】:

    【解决方案2】:
    • Contact 是单个联系人(姓名和电话号码)
    • ContactsContacts集合

    他们在这里:

     public class Contact {
       public Contact(string name, string number) {
         if (null == name)
           throw new ArgumentNullException(nameof(name));
         if (null == number) 
           throw new ArgumentNullException(nameof(number));
    
         //TODO: Add more validation here
    
         Name = name;
         Number = number;   
       }
    
       public string Name {get;}
       // Let it be of type string: we can have numbers like "+1(555)123-45-67" 
       public string Number {get;}
    
       public override string ToString() => $"{Name} {Number}";
    
       public bool Equals(Contact other) {
         if (ReferenceEquals(this, other))
           return true;
         if (null == other)
           return false;
    
         return string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase) &&
                string.Equals(Number, other.Number, StringComparison.OrdinalIgnoreCase);
       }
    
       public override bool Equals(object obj) => obj is Contact other && Equals(other);
    
       public override int GetHashCode() => 
         Number?.GetHashCode(StringComparison.OrdinalIgnoreCase) ?? 0;
     }
    

    集合可以是(如果你喜欢List&lt;T&gt;

    public class Contacts : IList<Contact> {
      private List<Contact> m_Items = new List<Contact>();
    
      public Contact this[int index] { 
        get => m_Items[index]; 
        set {
          if (null == value)
            RemoveAt(index);
          else
            m_Items[index] = value;
        } 
      }
    
      public void Add(Contact item) {
        if (null == item)
          throw new ArgumentNullException(nameof(item));
    
          m_Items.Add(item);
      }
    
      public void Insert(int index, Contact item) {
        if (null == item)
          throw new ArgumentNullException(nameof(item));
    
        m_Items.Insert(index, item);
      }
    
      public int Count => m_Items.Count;
      public bool IsReadOnly => false;
      public void Clear() => m_Items.Clear();
      public bool Contains(Contact item) => m_Items.Contains(item);
      public void CopyTo(Contact[] array, int arrayIndex) => m_Items.CopyTo(array, arrayIndex);
      public IEnumerator<Contact> GetEnumerator() => m_Items.GetEnumerator();
      public int IndexOf(Contact item) => m_Items.IndexOf(item);
      public bool Remove(Contact item) => m_Items.Remove(item);
      public void RemoveAt(int index) => m_Items.RemoveAt(index);
      IEnumerator IEnumerable.GetEnumerator() => m_Items.GetEnumerator();
    }
    

    那么你就可以轻松使用它了

    private Contacts myContacts = new Contacts() {
      new Contact("John", "01"),
      new Contact("Jack", "02"),
      new Contact("Jay", "03"), 
    };
    
    ...
    
    public void viewAllContacts() {
      foreach (var contact in myContacts)
        Console.WriteLine(contact);           
    }
    

    【讨论】:

    • RemoveRemoveAt 给自己打电话。但我看不出实施IList&lt;T&gt; 的原因。继承或实现集合不应该是默认的,而是有一个集合,所以在这个类中有List&lt;Contact&gt;作为属性就足够了。最后一部分展示了如何访问AppOptions 中的列表并不是很有帮助,因为AppOptions 不应该负责创建和填充该列表。
    【解决方案3】:

    首先,这样声明类不是好的编程方法,您可以创建具有属性contactName 和contactNumber 的类,然后创建另一个具有listMethod 的类。你应该使用这个类来获取数据。

    无论如何,在这种情况下,您只需要更改 listMethod 的返回类型,它现在是无效的,因此不返回任何内容,您也可以使用 foreach 循环遍历联系人。

    public class ContactsList
        {
            public string contactName { get; set; }
            public int contactNumber { get; set; }
    
            public List<ContactsList> listMethod()
            {
                List<ContactsList> contacts = new List<ContactsList>();
                {
                    contacts.Add(new ContactsList { contactName = "John", contactNumber = 01 });
                    contacts.Add(new ContactsList { contactName = "Jack", contactNumber = 02 });
                    contacts.Add(new ContactsList { contactName = "Jay", contactNumber = 03 });
                }
            }
        }
    
     class AppOptions
        {
            ContactsList contactList = new ContactsList();
            public void viewAllContacts()
            {
               var contacts = contactList.listMethod();
               foreach(var item in contacts)
               {
                   Console.WriteLine(item.contactName);
                   Console.WriteLine(item.contactNumber);
               }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多