これは前の質問に関連していますが、個別に投稿するのに十分な違いがあるようです。
ユーザー入力(DomAttributeIds
およびIntlAttributeIds
)から文字列配列に格納される設定があります。条件付きで値の配列を作成して、コードを実行しようとしています。条件は次のとおりです。
- 存在する場合
DomAttributesSettings
は、値の配列を作成し、それらをAddAttributeEdit()
メソッドに渡します。 - 存在する場合
IntlAttributesSettings
は、それらの設定の配列を作成し、条件1の設定と明確に(重複なしで)組み合わせて、その配列を残りのコードに渡し、最終的に各配列要素をAddAttributeEdit()
メソッドに渡します。
以下のコードは、「重複なし」の部分を除いて機能しているようです。LinqのUnionおよび/またはDistinctメソッドを使用するとこれが可能になると思いましたが、何か間違ったことをしているに違いありません。私のコードは次の例外をスローします:
同じID'trAttribute_493'を持つ複数のコントロールが見つかりました。FindControlでは、コントロールに一意のIDが必要です。
これは、そのIDが両方の設定に存在するためです。最後のAddAttributeEdit()
メソッドには、渡された値に基づいてIDを使用してテーブルとセルを作成するコードが含まれています。2つの配列の明確な結合を得るために私は何を間違っていますか?
コードは次のとおりです。
private void LoadAttributes()
{
if (!string.IsNullOrEmpty(DomAttributesSetting))
{
string[] attributeIds;
if (!string.IsNullOrEmpty(IntlAttributesSetting))
{
string[] domattributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
string[] intlattributeIds = IntlAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
IEnumerable<string> atrributeIdList = domattributeIds.Union(intlattributeIds).Distinct();
attributeIds = atrributeIdList.ToArray();
}
else
{
attributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
foreach (string attributeId in attributeIds)
{
int attrId = -1;
if (int.TryParse(attributeId, out attrId) && attrId != -1)
{
Arena.Core.Attribute attribute = new Arena.Core.Attribute(attrId);
PersonAttribute personAttribute = (PersonAttribute)person.Attributes.FindByID(attribute.AttributeId);
if (personAttribute == null)
personAttribute = new PersonAttribute(person.PersonID, attrId);
AddAttributeEdit(attribute, personAttribute, true);
}
}
}
}...