我有一个字符串列表
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,我们将重新开始,导致无限循环。
有解决方法吗?
答案 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;
}
答案 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()),而只忽略原始文件名。