C# 将 2 个字符串数组合并为一个具有唯一值的数组
本文关键字:数组 一个 唯一 字符串 合并 | 更新日期: 2023-09-27 18:33:34
这与之前的问题有关,但似乎足够不同,可以单独发布:
我有存储在用户输入(DomAttributeIds
和IntlAttributeIds
(的字符串数组中的设置。我正在尝试有条件地构建一个值数组来执行一些代码。条件是:
- 如果
DomAttributesSettings
存在,请创建一个值数组并将其传递给AddAttributeEdit()
方法。 - 如果存在
IntlAttributesSettings
,请创建这些设置的数组,并将它们与条件 1 中的设置单独组合(无重复(,并将该数组传递给代码的其余部分,并最终将每个数组元素传递给AddAttributeEdit()
方法。
下面的代码似乎可以工作,除了"没有重复"部分。我以为使用 Linq 的联合和/或 Distinct 方法可以做到这一点,但我一定做错了什么。我的代码抛出以下异常:
找到具有相同 ID "trAttribute_493"的多个控件。FindControl 要求控件具有唯一的 ID。
我知道这是因为该ID存在于两个设置中。最后的 AddAttributeEdit()
方法包含基于传递给它的值生成具有 Id 的表和单元格的代码。我做错了什么才能获得两个数组的不同联合?
这是代码:
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);
}
}
}
}...
您可能在
逗号分隔列表中的值周围有填充(例如"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()
。
某些整数必须具有不同的字符串表示形式 - 例如前导"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 = ...
您是否有两个仅因大小写而异的字符串?默认情况下,Linq 不会将它们视为重复项。试试这个:
domattributeIds.Union(intlattributeIds, StringComparer.CurrentCultureIgnoreCase)
以下代码将从 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(); ;
}
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"。 确保您的输入不包含空格
使用 LINQ 中的联合,例如:
string[] domattributeIds = new string[] { "a", "b", "c" };
string[] intlattributeIds = new string[] { "a", "c", "d" };
string[] combined = domattributeIds.Union(intlattributeIds).ToArray();
新数组"组合"具有值"a"、"b"、"c"、"d">