这与previous question有关,但似乎不同,可以单独发布:
我的设置存储在来自用户输入(DomAttributeIds
和IntlAttributeIds
)的字符串数组中。我试图有条件地构建一个值数组来执行一些代码。条件是:
DomAttributesSettings
,请创建值数组并将其传递给AddAttributeEdit()
方法。IntlAttributesSettings
,请创建这些设置的数组,并将它们与条件一中的设置明确地组合(无重复),并将该数组传递给其余代码,最后将每个数组元素传递给{ {1}}方法。下面的代码似乎有效,除了“没有重复”部分。我认为使用Linq的Union和/或Distinct方法可以做到这一点,但我必须做错事。我的代码抛出以下异常:
找到了具有相同ID“trAttribute_493”的多个控件。 FindControl要求控件具有唯一ID。
我知道这是因为两个设置都存在该ID。最后的AddAttributeEdit()
方法包含使用基于传递给它的值的Ids构建表和单元格的代码。为了获得两个数组的明显联合,我做错了什么?
以下是代码:
AddAttributeEdit()
答案 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(); ;
}