1

这与上一个问题有关,但似乎不同,可以单独发布:

DomAttributeIds我有从用户输入(和)存储在字符串数组中的设置IntlAttributeIds。我正在尝试有条件地构建一个值数组来执行一些代码。条件是:

  1. 如果DomAttributesSettings存在,则创建一个值数组并将它们传递给AddAttributeEdit()方法。
  2. 如果IntlAttributesSettings存在,则创建这些设置的数组,并将它们与条件一中的设置明显结合(无重复),并将该数组传递给代码的其余部分,最终将每个数组元素传递给AddAttributeEdit()方法。

除了“无重复”部分之外,下面的代码似乎有效。我认为使用 Linq 的 Union 和/或 Distinct 方法可以做到这一点,但我一定做错了什么。我的代码抛出以下异常:

找到具有相同 ID 'trAttribute_493' 的多个控件。FindControl 要求控件具有唯一的 ID。

我知道这是因为该 id 存在于两种设置中。最后的AddAttributeEdit()方法包含基于传递给它的值构建带有 Ids 的表格和单元格的代码。为了获得两个数组的不同联合,我做错了什么?

这是代码:

    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);
                }

            }


        }

    }...
4

6 回答 6

2

您可能对逗号分隔列表中的值进行了填充(例如“Prop1, Prop2”与“Prop1,Prop2”),或者大小写不同。

尝试从输入中修剪每个值并使用不区分大小写的比较器,如下所示:

var domattributeIds = DomAttributesSetting
    .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(x=>x.Trim());

var intlattributeIds = IntlAttributesSetting
    .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(x=>x.Trim());

var attributeIds = domattributeIds
    .Union(intlattributeIds, StringComparer.InvariantCultureIgnoreCase)
    .ToArray();

你甚至不需要Distinct()在最后打电话。

于 2012-05-09T15:03:37.960 回答
1

Do you have two strings that vary only by case? Linq won't see those as duplicates by default. Try this instead:

domattributeIds.Union(intlattributeIds, StringComparer.CurrentCultureIgnoreCase)
于 2012-05-09T15:33:07.257 回答
1

您必须对某些整数有不同的字符串表示形式 - 例如前导“0”。

您最好的选择是先转换为ints,然后运行Distinct​​.

就像是:

var ints = attributeIds.Select( s =>
{
  int i;
  return Int32.TryParse( s, out i ) ? i : -1;
};

var uniques = ints.Where( i => i != -1 ).Distinct().ToList();

foreach ( int attrId in uniques )
{
  Arena.Core.Attribute attribute = ...
于 2012-05-09T15:06:38.567 回答
0
 string a = "a,b, c";
 string b = "b,c,d";
 String[] ass  = a.Split( new char[]{','}, StringSplitOptions.RemoveEmptyEntries);
 String[] bss =  b.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
 var list = ass.Union(bss).Distinct().ToArray();
 StringBuilder sb = new StringBuilder();
 foreach ( String s in list)
  {
    sb.Append(s);
  }
 Text = sb.ToString();

由于空格,最后的文本是“ab ccd”。确保您的输入不包含空格

于 2012-05-09T15:03:54.573 回答
0

使用 LINQ 中的 Union,例如:

string[] domattributeIds = new string[] { "a", "b", "c" };
string[] intlattributeIds = new string[] { "a", "c", "d" };

string[] combined = domattributeIds.Union(intlattributeIds).ToArray();

新数组“组合”具有值“a”、“b”、“c”、“d”

于 2012-05-09T14:54:34.193 回答
0

以下代码将从 2 个字符串数组中返回不同的字符串数组

public string[] UniqueNames(string[] names1, string[] names2) {
    newName = names1.ToList();
    foreach (var dr in names2) {
        if (!newName.Contains(dr)) {
            newName.Add(dr);
        }
    }
    string[] newNameArray = newName.ToArray();
    return newNameArray;
}

或者你也可以试试

public string[] UniqueNames(string[] names1, string[] names2) {            
    return names1.Union(names2).ToArray(); ;            
}
于 2020-12-19T12:58:33.003 回答