【问题标题】:How to address specific element in list如何处理列表中的特定元素
【发布时间】:2019-12-03 16:30:50
【问题描述】:

我想创建“列表列表”。应该是:

组(有成员列表)

成员(具有名称和属性列表)

属性(具有名称和值)

我想要的是有可能将属性添加到已定义组内的成员(由其名称指定)中。像这样的:

membersgroup.AddNewMember(memberXYZ);
...
membersgroup.memberXYZ.AddProperty(nameXYZ, valueXYZ).

我无法使用列表来实现这个...我找到了 Hashable 类,但我不确定这是否可用...并且不能让它也能工作...

感谢您的任何建议:)

【问题讨论】:

  • 会员名在会员中是唯一的吗?属性名称在属性中是唯一的吗?您可能正在寻找Dictionary

标签: c# list hashable


【解决方案1】:

好吧,我建议您创建一个自定义类而不是您的方法。但除此之外,您可以使用字典。

var properties = new Dictionary<string, string>();
properties.Add("Prop1", "Value");

var members = new Dictionary<string, Dictionary<string, string>>();
members.Add("Member1", properties);

var group = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();
group.Add("GroupName", members);

【讨论】:

    【解决方案2】:
    public class Group
    {
    public Group()
    {
        Members = new List<Member>();
    }
    
    public IEnumerable<Member> Members { get; set; }
    }
    
    public class Member
    {
    public Member()
    {
        Properties = new Dictionary<string, string>();
    }
    
    public string Name { get; set; }
    IDictionary<string, string> Properties { get; set; }
    }
    

    字典可以有一个键和一个值,并且键应该是唯一的。 如果您想在名称和值旁边添加其他内容,也可以创建类属性

    【讨论】:

      【解决方案3】:

      我会使用索引器。

      这是部分实现:

      class Group 
      {
          private List<Member> _members;
      
          public string this
          {
              get
              {
                  return _members.Find(m => m.Name == value);
              }
              // You can also implement set here if you want...
          }
      }
      
      class Member
      {
          private List<Property> _properties;
      
          public string Name {get;set;}
      
          public string this
          {
              get
              {
                  return _properties.Find(m => m.Name == value);
              }
          }
      }
      
      class Property
      {
          public string Name {get;set;}
      
          public string Value {get;set;}
      }
      

      及用法:

      var g = new Group();
      g[memberName][propertyName].Value = someValue;
      

      注意:这个实现是部分的!它仍然需要构造函数逻辑和您可能需要的任何其他逻辑。

      【讨论】:

        【解决方案4】:

        可能最好的解决方案是使用 C# 类 Dictionary - 正如 zetawars 所建议的那样,或自定义类 - 如 Zohar Peled 所建议的那样,或者两者的混合 - 如 gandalf 所建议的那样。


        但是,为了使用类似于问题中要求的语法...

        membersgroup.AddNewMember(memberXYZ);
        ...
        membersgroup.memberXYZ.AddProperty(nameXYZ, valueXYZ).
        

        您可以滥用ExpandoObjectAction,然后像这样真棒

        dynamic membersgroup = new ExpandoObject();
        
        var getNewMemberObject = new Func<dynamic>(() =>
        {
            dynamic memberObject = new ExpandoObject();
            var addPropertyAction = new Action<string, string>((propertyName, propertyValue) => 
            {
                ((IDictionary<string, object>)memberObject).Add(propertyName, propertyValue);
            });
        
            memberObject.AddProperty = addPropertyAction;
        
            return memberObject;
        });
        
        var addNewMemberAction = new Action<string>((memberName) =>
        {
            ((IDictionary<string, object>)membersgroup).Add(memberName, getNewMemberObject());
        });
        
        membersgroup.AddNewMember = addNewMemberAction;
        
        string memberXYZ = nameof(memberXYZ);
        string nameXYZ = nameof(nameXYZ);
        string valueXYZ = nameof(valueXYZ);
        
        // look we did it!
        membersgroup.AddNewMember(memberXYZ);
        membersgroup.memberXYZ.AddProperty(nameXYZ, valueXYZ);
        
        // and it actually works
        var actualValue = membersgroup.memberXYZ.nameXYZ;
        Console.WriteLine(actualValue); // "valueXYZ"
        

        (当然是科学)

        【讨论】:

          猜你喜欢
          • 2019-02-02
          • 1970-01-01
          • 1970-01-01
          • 2020-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-22
          • 1970-01-01
          相关资源
          最近更新 更多