如何从其他两列更新基于文件名的文件名最高值

时间:2014-09-22 23:07:37

标签: c# wpf filenames

我需要根据其他两列中文件名的最高名更新文件名。 例如: - 我有一个名为221-8812_01的coumn3和名为221-8812_02的第4列。所以我想将221-8812_02文件名更新为column1。

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

注意: -  我有像323-2332_0A和323-2332_0B这样的文件名。所以我需要更新column1中的323-2332_0B。 或者可能是111-4334_0D和111-4334_0C 所以我需要将111-4334_0D更新为column1。

所以它的第一个服务器号码保持不变。七个数字之后...当(_)下划线开始时...我需要比较..根据字母或数字递增顺序 !!!! 我怎么能这样做,

我的代码段:

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

2 个答案:

答案 0 :(得分:1)

根据你的逻辑,我已经找到了一种快速而简单的方法来比较2个字符串并确定哪个更高。

请注意:

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

    搜索下划线
    // returns true if a is "higher" than b
    // example string format 323-2332_0A
    private static bool IsHigher(string a, string b)
    {
        if(string.CompareOrdinal(a.ToUpper(), b.ToUpper()) == 0)
            throw new InvalidOperationException("The strings are equal!");
    
        // Compare first 3 numbers
        var inta = Convert.ToInt32(a.Substring(0, 3));
        var intb = Convert.ToInt32(b.Substring(0, 3));
        var result = inta.CompareTo(intb);
    
        if (result > 0) return true; // a is "higher" than b
        if (result < 0) return false; // b is "higher" than a
        // if a = b, code continues down ...
    
        // Compare middle 4 numbers
        inta = Convert.ToInt32(a.Substring(4, 4));
        intb = Convert.ToInt32(b.Substring(4, 4));
        result = inta.CompareTo(intb);
    
        if (result > 0) return true; // a is "higher" than b
        if (result < 0) return false; // b is "higher" than a
        // if a = b, code continues down ...
    
        // Compare last number
        inta = Convert.ToInt32(a.Substring(9, 1));
        intb = Convert.ToInt32(b.Substring(9, 1));
        result = inta.CompareTo(intb);
    
        if (result > 0) return true; // a is "higher" than b
        if (result < 0) return false; // b is "higher" than a
        // if a = b, code continues down ...
    
        // Compare alphabet
        var stringa = a.Substring(10, 1).ToUpper();
        var stringb = b.Substring(10, 1).ToUpper();
        result = String.CompareOrdinal(stringa, stringb);
    
        if (result > 0) return true; // a is "higher" than b
        if (result < 0) return false; // b is "higher" than a
    
        return true; // we should not get here.
    
    }
    

修改

在将行添加到datagrid之前,您可能会使用此代码。

例如,如果您想将字符串与当前文件名进行比较,并且只选择“更高”字符串,则可以执行此操作。

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);
var filenameonly = Path.GetFileNameWithoutExtension(file);
dt.Rows.Add(filenameonly, 
            IsHigher(filenameonly, cdf) ? filenameonly : cdf, 
            file, 
            IsHigher(filenameonly, abc) ? filenameonly : abc, 
            String.Empty, 
            IsHigher(filenameonly, ghi) ? filenameonly : ghi
           );

答案 1 :(得分:1)

让它变得简单

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

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

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