C# 在对象初始值设定项中引用要初始化的对象的其他属性

C# 在对象初始值设定项中引用要初始化的对象的其他属性,c#,C#,创建以下对象时: var customers = new Customers { Persons = new List<Person> { new Person { CustomId = "111" }, new Person { CustomId = "222" } }, Organizations = new List<Organization> { new Organizatio

创建以下对象时:

var customers = new Customers
{
    Persons = new List<Person>
    {
        new Person { CustomId = "111" },
        new Person { CustomId = "222" }
    },
    Organizations = new List<Organization>
    {
        new Organization { CustomId = "333" }
    },
    Keys = new HashSet<string> { "111", "222", "333" }
};
但我无法在与客户相同的初始化中从人员和组织属性创建密钥?

您可以先创建集合,然后:

var persons=新列表
{
新人{CustomId=“111”},
新人{CustomId=“222”}
};
var组织=新列表
{
新组织{CustomId=“333”}
};
var key=persons.Select(p=>p.CustomId)
.Concat(organizations.Select(o=>o.CustomId));
var客户=新客户
{
人=人,
组织=组织,
Keys=新哈希集(Keys),
}
但正如其他人所说,这种实现存在更多的问题。是否要对Customers类的每个使用者使用此语法?您将如何使密钥集合与人员和组织集合保持最新,如在其中添加或删除项目时

public class Customers
{
    public List<Person> Persons { get; set; }
    public List<Organization> Organizations { get; set; }

    public Customers()
    {
        Persons = new List<Person>();
        Organizations = new List<Organization>();
    }

    public Customers(IEnumerable<Person> persons,
                     IEnumerable<Organization> organizations)
        : this()
    {
        Persons.AddRange(persons);
        Organizations.AddRange(organizations);
    }

    public IEnumerable<string> Keys
    {
        return Persons.Select(p => p.CustomId)
                      .Concat(Organizations.Select(o => o.CustomId));
    }
}
公共类客户
{
公共列表人员{get;set;}
公共列表组织{get;set;}
公众客户()
{
人员=新列表();
组织=新列表();
}
公共客户(包括无数人,
(可数组织)
:此()
{
人。添加范围(人);
组织。AddRange(组织);
}
公共IEnumerable密钥
{
返回人员。选择(p=>p.CustomId)
.Concat(Organizations.Select(o=>o.CustomId));
}
}
然后,呼叫站点可能如下所示:

var persons = new List<Person>
{
    new Person { CustomId = "111" },
    new Person { CustomId = "222" }
};

var organizations = new List<Organization>
{
    new Organization { CustomId = "333" }
};

var customers = new Customers(persons, organizations);
var keys = customers.Keys;
var persons=新列表
{
新人{CustomId=“111”},
新人{CustomId=“222”}
};
var组织=新列表
{
新组织{CustomId=“333”}
};
var客户=新客户(个人、组织);
var-keys=customers.keys;

您可以先创建集合,然后:

var persons=新列表
{
新人{CustomId=“111”},
新人{CustomId=“222”}
};
var组织=新列表
{
新组织{CustomId=“333”}
};
var key=persons.Select(p=>p.CustomId)
.Concat(organizations.Select(o=>o.CustomId));
var客户=新客户
{
人=人,
组织=组织,
Keys=新哈希集(Keys),
}
但正如其他人所说,这种实现存在更多的问题。是否要对Customers类的每个使用者使用此语法?您将如何使密钥集合与人员和组织集合保持最新,如在其中添加或删除项目时

public class Customers
{
    public List<Person> Persons { get; set; }
    public List<Organization> Organizations { get; set; }

    public Customers()
    {
        Persons = new List<Person>();
        Organizations = new List<Organization>();
    }

    public Customers(IEnumerable<Person> persons,
                     IEnumerable<Organization> organizations)
        : this()
    {
        Persons.AddRange(persons);
        Organizations.AddRange(organizations);
    }

    public IEnumerable<string> Keys
    {
        return Persons.Select(p => p.CustomId)
                      .Concat(Organizations.Select(o => o.CustomId));
    }
}
公共类客户
{
公共列表人员{get;set;}
公共列表组织{get;set;}
公众客户()
{
人员=新列表();
组织=新列表();
}
公共客户(包括无数人,
(可数组织)
:此()
{
人。添加范围(人);
组织。AddRange(组织);
}
公共IEnumerable密钥
{
返回人员。选择(p=>p.CustomId)
.Concat(Organizations.Select(o=>o.CustomId));
}
}
然后,呼叫站点可能如下所示:

var persons = new List<Person>
{
    new Person { CustomId = "111" },
    new Person { CustomId = "222" }
};

var organizations = new List<Organization>
{
    new Organization { CustomId = "333" }
};

var customers = new Customers(persons, organizations);
var keys = customers.Keys;
var persons=新列表
{
新人{CustomId=“111”},
新人{CustomId=“222”}
};
var组织=新列表
{
新组织{CustomId=“333”}
};
var客户=新客户(个人、组织);
var-keys=customers.keys;

将密钥放入公共属性,如:

public HashSet<string> Keys
{
   get
   {
      // create and return a new hashset from persons and organizations
   }    
}
公共哈希集密钥
{
得到
{
//从个人和组织创建并返回新哈希集
}    
}

这样,您必须考虑更新密钥成员。

将密钥设置为公共属性,如:

public HashSet<string> Keys
{
   get
   {
      // create and return a new hashset from persons and organizations
   }    
}
公共哈希集密钥
{
得到
{
//从个人和组织创建并返回新哈希集
}    
}


这样,您必须考虑更新您的密钥成员。

您可以在对象初始值设定项中这样做,afaikPerhaps
客户应根据属性推断密钥?为什么要显式执行此操作?如果所有客户都是这样构造的,那么这应该在
客户
构造函数中执行。为什么“某人”显式设置密钥是为了能够基于CustomId在客户中执行搜索,个人和组织可以具有相同的CustomId,它不是唯一的。要使用.Distinct()之类的操作,请使用键,而不是在两个集合(个人、组织)中搜索Count。您可以在对象初始值设定项中执行此操作。afaikPerhaps
客户应根据属性推断键吗?为什么要显式执行此操作?如果所有客户都是这样构造的,那么这应该在
客户
构造函数中执行。为什么“某人”显式设置密钥是为了能够基于CustomId在客户中执行搜索,个人和组织可以具有相同的CustomId,它不是唯一的。使用.Distinct()之类的操作。使用键而不是在两个集合(个人、组织)中搜索Count可能是一种方法,但他如何添加键并在运行时检索它们??好的,所以键不能是属性我认为应该使用SetKeys(键作为参数)和GetKeys()这两个是哪一个lists@Kamel不知道你的意思。OP定义了一个带有
Keys
属性的
Customers
类,该属性是一个有效标识符。我没有更改类定义;现在在添加人员/组织时“自动”处理。因此,简短的回答是您不能在第一次创建中调用Person[0]。CustomId@Niike2是的,你不能在对象初始值设定项中引用你正在初始化的对象的其他属性。这可能是一种方法,但他如何添加键和r