将在一个函数中创建的字符串值作为参数传递给函数

时间:2014-09-26 14:55:36

标签: c# reference split

我有一个名为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;
}

但我不确定如何正确地做到这一点?这似乎很容易,但我觉得我要把它变得比它需要的更难。

3 个答案:

答案 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;
}