添加到字符串列表中检查重复项并在末尾附加数字

时间:2012-12-13 10:07:36

标签: c# string

我有一个字符串列表

var lsNameList = new List<string>();

这是一个文件名列表。 我想迭代检查匹配文件名的文件集合。如果有匹配则附加一个数字。数字将以1为增量。例如,如果文件名在列表中,则附加在1上,因此它将是filename1。如果filename1在列表中,则将其更改为filename2,依此类推。

foreach (var SourceFile in SourceFiles)
  if (lsNameList.Contains(SourceFile.Label.ToLower()))
     // Add the name to the list but with a number at the end

我完成了迭代和文件名检查但是当数字达到两位数时我遇到了问题

var sLastCharacter = SourceFile.Label[SourceFile.Label.Length - 1].ToString();
var iLast = StringToInt(sLastCharacter);

如果SourceFile.Label是filename10怎么办?最后一位数字将为0,我们将重新开始,导致无限循环。

有解决方法吗?

6 个答案:

答案 0 :(得分:1)

可以添加一个从文件末尾获取所有可能数字的函数:

so(a 伪代码

var resultString = string.Empty;
for(int i=SourceFile.Label.Length - 1,i>=0;i--)
{
   var ch = SourceFile.Label[i];
   if(Char.IsNumber(ch))
     resultString = new string(ch) + resultString; //ADD IN FRONT
}

var iLast = StringToInt(resultString );

这是在您无法更改文件名格式的情况下。但如果可以的话,你可以在数字之前加一个分隔符,比如说“_”。因此,当您按文件名拆分时,您将知道右侧只有您需要的数字。

答案 1 :(得分:1)

不要仅检查最后一个字符,而是检查整个数字并将其解析为int。但我会在名称和数字之间使用分隔符,否则如果文件名本身以数字结尾则会出现问题。

您可以使用Linq和自定义方法来增加数字并将其添加到其他集合中:

IEnumerable<String> newPaths = SourceFiles
    .Select(sf => AddIncrementFileNameSuffix(sf.Label, lsNameList,"_"));

这里是所有“神奇”

public static string AddIncrementFileNameSuffix(string path, IList<string> paths, string separator)
{
    string dir = Path.GetDirectoryName(path);
    string ext = Path.GetExtension(path);
    string fileName = Path.GetFileName(path);
    string[] tokens = fileName.Split(new[] { separator }, StringSplitOptions.None);

    int num = 0;
    int.TryParse(tokens.Last(), out num);

    var dups = paths.Where(n => n.Equals(path, StringComparison.OrdinalIgnoreCase));
    while (dups.Any())
    {
        path = Path.Combine(dir, tokens.First() + separator + ++num + ext);
    }

    paths.Add(path);
    return path;
}

DEMO

答案 2 :(得分:0)

试试这个

foreach (var SourceFile in SourceFiles)
  if (lsNameList.Contains(SourceFile.Label.ToLower()))
  {
    int i = 1;
    while (lsNameList.Contains(SourceFile.Label.ToLower() + i.ToString()))
      i++;
    //add file with i as number
  }

答案 3 :(得分:0)

foreach (var SourceFile in SourceFiles)
{
    if (lsNameList.Contains(SourceFile.Label.ToLower()))
    {
        int fileNumber = 1;
        while (lsNameList.Contains((SourceFile.Label + fileNumber).ToLower()))
        {
           fileNumber++;
        }
        SourceFile.Label = SourceFile.Label + fileNumber;
    }
    lsNameList.Add(SourceFile.Label.ToLower());
}

答案 4 :(得分:0)

您可以使用LINQ获取重复项列表,然后将数字附加到每个重复项的末尾,如下所示:

var list = new List<string>() { "filename", "filename", "42", "another_file", "another_file" };
foreach (var item in list.Distinct().ToArray())
{
    var duplicates = list.Where(temp => temp == item).ToArray();
    for (int i = 0; i < duplicates.Length; i++)
    {
        duplicates[i] = string.Concat(item, (i + 1).ToString());
    }
 }

答案 5 :(得分:0)

不要假设只有字符串的最后一个字符是计数,你应该使用所有字符(你可以使用Substring()),而只忽略原始文件名。