2012-12-13 34 views
0

附加上一些我有一個字符串添加到字符串檢查重複,並在年底

var lsNameList = new List<string>(); 

是文件名列表的列表清單。 我想遍歷檢查文件名匹配的文件集合。如果有匹配,則附加在一個數字上。該數字將在一個增加。例如,如果文件名在列表中,則附加在1上,因此它將是文件名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 

我有迭代和文件名進行檢查,但是當數量運行到兩位數

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

如果SourceFile.Label是什麼filename10我有一個問題。最後一位數字爲0,我們將重新開始,導致無限循環。

有沒有辦法解決這個問題?

+1

這.net的版本?你可以用linq嗎? –

+0

如果文件名稱爲'42'但沒有字母? –

+0

你能跟蹤你在文件名中所做的更改嗎?我認爲你應該提供更多關於你的場景的信息。 – VahidNaderi

回答

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

+0

感謝隊友這做了伎倆 –

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 
    } 
+1

也許你爲什麼downvoting評論? – Destrictor

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

這是情況您無法更改文件名格式。但是如果可以的話,你可以在數字前添加一個分隔符,比如說「_」。所以當你通過它分割文件名時,你會知道在右邊只有你需要的數字。

+0

如果文件名本身的末尾有數字,則不起作用。 – sohil

+0

@sohil:同意,爲此我也添加第二個選項。有**必須有**的某種方式知道。它可能是一些字符(分隔符),或文件名沒有數字的概念,或最大可能的數字字符串長度,或其他東西... – Tigran

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()); 
} 
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()); 
    } 
} 
0

而是假設只有字符串的最後一個字符會計數,你應該使用所有的字符(你可以使用Substring()),只忽略原始文件名。