C# 如何更新其他两列中基于文件名的文件名的最大值

C# 如何更新其他两列中基于文件名的文件名的最大值,c#,wpf,filenames,C#,Wpf,Filenames,我需要根据其他两列中文件名的最高名称更新文件名。 例如:-我有一个coumn3叫221-8812\u 01,第4列叫221-8812\u 02。因此,我想将221-8812_02文件名更新为第1列 反之亦然,如果我在第3列中有一个名为323-1111_03的文件名,在第3列中有一个名为323-1111_02,那么我想在第1列中更新323-1111_03 注意:- 我有像323-2332_0A和323-2332_0B这样的文件名。所以我需要更新第1列中的323-2332_0B。 或者可能是111-

我需要根据其他两列中文件名的最高名称更新文件名。 例如:-我有一个coumn3叫
221-8812\u 01
,第4列叫
221-8812\u 02
。因此,我想将
221-8812_02
文件名更新为第1列

反之亦然,如果我在第3列中有一个名为
323-1111_03
的文件名,在第3列中有一个名为
323-1111_02
,那么我想在第1列中更新323-1111_03

注意:- 我有像323-2332_0A和323-2332_0B这样的文件名。所以我需要更新第1列中的323-2332_0B。 或者可能是111-4334_0D和111-4334_0C,因此我需要更新到第1列

所以它的第一个服务器号保持不变。七个数字之后。。当(41;下划线开始时。。我需要比较一下。。按字母或数字的递增顺序排列!!!! 我该怎么做呢

我的代码片段:

 private void filter_table()
    {
 // create a check box in column0
        DataGridViewCheckBoxColumn colCB = new DataGridViewCheckBoxColumn();
        DatagridViewCheckBoxHeaderCell cbHeader = new DatagridViewCheckBoxHeaderCell();
        colCB.HeaderCell = cbHeader;
        dataGridView1.Columns.Add(colCB);


        //Initialize Directory path
        string draft = ini.ReadValue("Location", "Draft");
        string release = ini.ReadValue("Location", "Release");
        string drawing = ini.ReadValue("Location", "Drawing");
        string archive = ini.ReadValue("Location", "Archive");

        if (!System.IO.Directory.Exists(draft))
            System.IO.Directory.CreateDirectory(draft);
        if (!System.IO.Directory.Exists(release))
            System.IO.Directory.CreateDirectory(release);
        if (!System.IO.Directory.Exists(drawing))
            System.IO.Directory.CreateDirectory(drawing);
        if (!System.IO.Directory.Exists(archive))
            System.IO.Directory.CreateDirectory(archive);

        string[] arrDraft = Directory.GetFiles(draft, "*", SearchOption.AllDirectories);
        string[] arrRelease = Directory.GetFiles(release, "*", SearchOption.AllDirectories);
        string[] arrDrawing = Directory.GetFiles(drawing, "*", SearchOption.AllDirectories);
        string[] arrArchive = Directory.GetFiles(archive, "*", SearchOption.AllDirectories);

        dt.Columns.Add("Drawing_Number");
        //dt.Columns["Part Number"].ReadOnly = true;

        dt.Columns.Add("Drawing");
        // dt.Columns["Drawing"].ReadOnly = true;

        dt.Columns.Add("Draft Path");
        // dt.Columns["Draft Path"].ReadOnly = true;

        dt.Columns.Add("Release Path");
        //  dt.Columns["Release Path"].ReadOnly = true;

        dt.Columns.Add("Error");
        //  dt.Columns["Error"].ReadOnly = true;

        dt.Columns.Add("Archive");

   // listing all the files according to the column3(draft path) filename.. and mating files from nearby column.
        List<FileDetails> lst = new List<FileDetails>();
        foreach (string file in arrDraft)
        {
            Finder finder = new Finder(Path.GetFileNameWithoutExtension(file).Substring(0, 7));
            string abc = Array.Find(arrRelease, finder.Match);
            string cdf = Array.Find(arrDrawing, finder.Match);
            string ghi = Array.Find(arrArchive, finder.Match);
            dt.Rows.Add(Path.GetFileNameWithoutExtension(file), cdf, file, abc, String.Empty, ghi);
        }

        dataGridView1.DataSource = dt;
    }

  private void Form1_Load(object sender, EventArgs e)
    {
        filter_table();
   }

   // Search predicate returns true if a string ends in "saurus".
    private static bool MatchFileName(String s, String _match)
    {
        return ((s.Length > 5) && (s.Substring(0, 7).ToLower() == _match.ToLower()));
    }


    public class FileDetails
    {
        public string FileName;
        public string Drawings;
        public string FilePathDraft;
        public string FilePathRelease;
        public string Comment;
        public string ErrorMsg;
    }
    public sealed class Finder
    {
        private readonly string _match;

        public Finder(string match)
        {
            _match = match.ToLower();
        }

   //findin the match and showing in grid view
        public bool Match(string s)
        {
            string fileName = s.Substring(s.LastIndexOf("\\") + 1);
            return ((fileName.Length > 5) && (fileName.Substring(0, 8).ToLower() == _match));
        }
    }
private void filter_table()
{
//在第0列中创建复选框
DataGridViewCheckBoxColumn colCB=新DataGridViewCheckBoxColumn();
DatagridViewCheckBoxHeaderCell cbHeader=新DatagridViewCheckBoxHeaderCell();
colCB.HeaderCell=cbHeader;
dataGridView1.Columns.Add(colCB);
//初始化目录路径
字符串draft=ini.ReadValue(“位置”、“草稿”);
字符串release=ini.ReadValue(“位置”、“释放”);
字符串绘图=ini.ReadValue(“位置”、“绘图”);
string archive=ini.ReadValue(“位置”、“存档”);
如果(!System.IO.Directory.Exists(草稿))
System.IO.Directory.CreateDirectory(草稿);
如果(!System.IO.Directory.Exists(release))
System.IO.Directory.CreateDirectory(发布版);
如果(!System.IO.Directory.Exists(绘图))
System.IO.Directory.CreateDirectory(绘图);
如果(!System.IO.Directory.Exists(archive))
System.IO.Directory.CreateDirectory(归档);
字符串[]arrDraft=Directory.GetFiles(草稿,“*”,SearchOption.AllDirectories);
字符串[]arrelease=Directory.GetFiles(release,“*”,SearchOption.AllDirectories);
字符串[]arrrawing=Directory.GetFiles(绘图“*”,SearchOption.AllDirectories);
字符串[]arrArchive=Directory.GetFiles(存档,“*”,SearchOption.AllDirectories);
dt.列。添加(“图纸编号”);
//dt.列[“零件号”]。只读=真;
dt.列。添加(“图纸”);
//dt.列[“图纸”]。只读=真;
dt.Columns.Add(“草稿路径”);
//dt.Columns[“草稿路径”].ReadOnly=true;
dt.Columns.Add(“发布路径”);
//dt.Columns[“发布路径”]。ReadOnly=true;
dt.Columns.Add(“错误”);
//dt.列[“错误”]。只读=真;
dt.列。添加(“存档”);
//根据column3(草稿路径)文件名..列出所有文件,并从附近的列中列出匹配文件。
List lst=新列表();
foreach(草稿中的字符串文件)
{
Finder=newfinder(Path.getfilenamwithoutextension(file.Substring(0,7));
字符串abc=Array.Find(arrelease,finder.Match);
字符串cdf=Array.Find(arrDrawing,finder.Match);
字符串ghi=Array.Find(arrArchive,finder.Match);
添加(Path.GetFileNameWithoutExtension(file),cdf,file,abc,String.Empty,ghi);
}
dataGridView1.DataSource=dt;
}
私有void Form1\u加载(对象发送方、事件参数e)
{
过滤表();
}
//如果字符串以“saurus”结尾,则搜索谓词返回true。
私有静态布尔匹配文件名(字符串s,字符串_匹配)
{
返回((s.Length>5)和&(s.Substring(0,7).ToLower()==_match.ToLower());
}
公共类文件详细信息
{
公共字符串文件名;
公共弦图;
公共字符串文件路径草稿;
公共字符串FilePathRelease;
公共字符串评论;
公共字符串ErrorMsg;
}
公共密封类查找器
{
私有只读字符串_匹配;
公共查找器(字符串匹配)
{
_match=match.ToLower();
}
//在匹配中查找并在网格视图中显示
公共布尔匹配(字符串s)
{
字符串文件名=s.Substring(s.LastIndexOf(“\\”)+1);
返回((fileName.Length>5)和&(fileName.Substring(0,8.ToLower()=_match));
}
}

我想出了一个快速而简单的方法来比较两个字符串,并根据您的逻辑确定哪个更高

请注意:

323-1111_0D
323-1111_FF
  • 您可能希望修改此代码并改为实现IComparable
  • 如果您喜欢将代码用作下面这样的静态方法,则需要处理两个字符串相等的情况
  • 如果您确信前7个数字始终相同,则可以省略该逻辑
  • 我的逻辑假设位置是固定的。如果位置是动态的,则需要修改代码以使用string.IndexOf(“\u”)

    让我们轻松一点

    string A = "323-1111_0A";
    string B = "323-1111_0D";
    MessageBox.Show(TakeLarger(A, B));
    
    private string TakeLarger(string first, string second)
    {
        int iResult = first.Substring(first.LastIndexOf("_")+1).CompareTo(second.Substring(second.LastIndexOf("_")+1));
    
        return (iResult == -1) ? second : first;
    }
    
    输出:

    323-1111_0D
    
    323-1111_FF
    

    如果最后两位是十六进制值,则可以使用此方法

    string A = "323-1111_FF";
    string B = "323-1111_1D";
    MessageBox.Show(TakeLarger(A, B));
    
    private string TakeLargerHex(string first, string second)
    {
        int iFirst = Convert.ToInt32(first.Substring(first.LastIndexOf("_")+1), 16);
        int iSecond = Convert.ToInt32(second.Substring(second.LastIndexOf("_")+1), 16);
        return (iFirst > iSecond) ? first : second;
    }
    
    输出:

    323-1111_0D
    
    323-1111_FF
    
    如果文件名存储在网格单元中,如
    MY_file_323-1111_FF.doc
    ,则需要从末尾删除扩展名,否则可以直接获取

    string A = dataGridView.Rows[i].Cells[2].Value.ToString();
    string B = dataGridView.Rows[i].Cells[3].Value.ToString();
    
    如果扩展名包含在字符串的末尾,则可以这样删除

    A = A.Substring(A.LastIndexOf(".")+1);
    

    为什么
    323-2332_0B
    323-2332_0A
    高,但是
    111-4334_0C
    111-4334_0D
    高?@DourHighArch我在找_0A,0B,0C。。继续。到0Z。。而在数字上它就像_01,02,03,04,05,06,07。。在最后两个月numbers@Shell.. 任何身份证