0

文字列のリストがあります

var lsNameList = new List<string>();

これはファイル名のリストです。ファイル名が一致するかどうかをチェックするファイルのコレクションを繰り返し処理したいと思います。一致する場合は、番号を追加します。数は1ずつ増加します。たとえば、filenameがリストにある場合は、filename1になるように1を追加します。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

反復とファイル名のチェックを実行しましたが、数値が2桁になると問題が発生します

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

SourceFile.Labelがfilename10の場合はどうなりますか。最後の桁は0になり、最初からやり直して無限ループを引き起こします。

これを回避する方法はありますか?

4

6 に答える 6

1

ファイルの最後からすべての可能な数字を取得する関数を追加できます。

そう(擬似コード

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 );

これは、ファイル名の形式を変更できない場合です。ただし、可能であれば、数値の前に「_」などの区切り文字だけを追加できます。したがって、ファイルの名前をそれで割ると、右側には必要な数字だけがあることがわかります。

于 2012-12-13T10:13:29.957 に答える
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;
}

デモ

于 2012-12-13T10:45:51.593 に答える
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
  }
于 2012-12-13T10:13:14.090 に答える
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());
}
于 2012-12-13T10:23:00.547 に答える
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());
    }
 }
于 2012-12-13T10:23:12.450 に答える
0

文字列の最後の文字だけがカウントになると想定する代わりに、元のファイル名だけを無視して、すべての文字を使用する必要があります(Substring()を使用できます)。

于 2012-12-13T10:25:20.330 に答える