C#将2个字符串数组合并为一个具有唯一值的数组

时间:2012-05-09 14:45:38

标签: c# arrays linq unions

这与previous question有关,但似乎不同,可以单独发布:

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

  1. 如果存在DomAttributesSettings,请创建值数组并将其传递给AddAttributeEdit()方法。
  2. 如果存在IntlAttributesSettings,请创建这些设置的数组,并将它们与条件一中的设置明确地组合(无重复),并将该数组传递给其余代码,最后将每个数组元素传递给{ {1}}方法。
  3. 下面的代码似乎有效,除了“没有重复”部分。我认为使用Linq的Union和/或Distinct方法可以做到这一点,但我必须做错事。我的代码抛出以下异常:

      

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

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

    以下是代码:

    AddAttributeEdit()

6 个答案:

答案 0 :(得分:1)

您可能在逗号分隔列表中的值周围填充(例如“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()

答案 1 :(得分:1)

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

您最好的选择是首先转换为int,然后运行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 = ...

答案 2 :(得分:1)

你有两个不同的字符串吗?默认情况下,Linq不会将这些视为重复项。试试这个:

domattributeIds.Union(intlattributeIds, StringComparer.CurrentCultureIgnoreCase)

答案 3 :(得分: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”

答案 4 :(得分: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”。确保你的输入不包含空格

答案 5 :(得分: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(); ;            
}