我有一个名为ValidColumns的函数,当完成后会包含一个由管道符号加入的id值字符串" |。"
private bool ValidColumns(string[] curGlobalAttr, int LineCount)
{
//test to see if there is more than 1 empty sku mod field in the imported file
string SkuMod = GetValue(curGlobalAttr, (int)GlobalAttrCols.SKU);
if(SkuMod =="")
ids += string.Join("|", OptionId);
}
我想要做的是获取id字符串并将其作为引用传递给另一个函数以检查它是否包含重复值:
protected bool CheckForDuplicates(ref string ids)
{
bool NoDupes = true;
string[] idSet = ids.Split('|');
for (int i = 1; i <= idSet.Length - 1; i++)
{
if (idSet[i].ToString() == idSet[i - 1].ToString()) { NoDupes = false; }
}
return NoDupes;
}
但我不确定如何正确地做到这一点?这似乎很容易,但我觉得我要把它变得比它需要的更难。
答案 0 :(得分:1)
if (idSet[i].ToString() == idSet[i - 1].ToString())
您只是根据之前的值检查每个值。如果对值进行了排序,那将会有效,但更简单的方法就是获取一个不同的列表并检查长度:
return (idSet.Length == idSet.Distinct().Count());
答案 1 :(得分:0)
你需要一个嵌套循环来执行此操作,它将查看每个项目并将其与另一个项目进行比较。这也将消除对它自己的检查,因此它并不总是返回false。
在此我们将跟踪我们已经检查过的内容,并且仅将新项目与项目进行比较,然后逐渐缩小第二个循环,以消除重复检查。
bool noDupes = true;
int currentItem = 0;
int counter = 0;
string[] idSet = ids.Split('|');
while(currentItem < idSet.Count)
{
counter = currentItem + 1;
while(counter < idSet.Count)
{
if(idSet[currentItem].ToUpper() == idSet[counter].ToUpper())
{
noDupes = false;
return noDupes;
}
counter ++;
}
currentItem ++;
}
return noDupes;
编辑:
有人指出我作为答案发布的选项总是会返回false,所以我删除了该选项并调整了此选项,使其更加健壮,更容易在逻辑上逐步完成。
希望这会有所帮助:)
答案 2 :(得分:0)
D Stanley的第二部分回答是你想要的
public bool CheckForDuplicates(string value)
{
string[] split = value.Split('|');
return split.Length != split.Distinct().ToArray().Length;
}