Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 18
  1. #1

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi VNFox
    BẠn chỉ cần rename và thêm số không (0). Ví dụ

    1.html -> 01.html
    2.html -> 02.html
    mình đã sắp được dạng xxx.html rồi
    Còn dạng quyen-xxx-chuong-xxx.html thì chưa được :v

  3. #3
    Ngày tham gia
    Sep 2015
    Đang ở
    Hà Nội
    Bài viết
    0
    Trích dẫn Gửi bởi Arhi
    mình đã sắp được dạng xxx.html rồi
    Còn dạng quyen-xxx-chuong-xxx.html thì chưa được :v
    Xóa chữ quyen voi chuong, đổi thành

    01-01.html
    01-02.html
    rồi ....

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Arhi
    Quy luật mình cần là quy luật của mình cần là cái quy luật sắp xếp theo tên của explorer ấy.
    Cái mình muốn là như 2 cái hình đầu tiên. còn cái hình thứ 3 là kết quả khi mình dùng lệnh c# để lấy dsFiles. Nó hơi sai theo ý của mình
    Nói như bạn là huề ! quy luật sắp xếp theo tên của explorer mỗi PC mỗi khác (tùy chọn / Customize).
    Bạn không mô tả được quy luật sắp xếp bạn muốn ?
    //
    Msdn :

    Mã:
    public static void Sort(    Array array,    IComparer comparer)
    //
    Mô tả và viết lại :
    int IComparer.Compare( Object x, Object y ) {
    //....
    }
    là xong.

    Ngoài ra có nhiều giải pháp khác.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn thử code này xem:

    Mã:
    var files1 = new DirectoryInfo(@"D:\folder1").GetFiles().ToArray().OrderBy(s => Int32.Parse(Regex.Match(s.Name, @"(\d*)\.html").Groups[1].Value));
    var files2 = new DirectoryInfo(@"D:\folder2").GetFiles().ToArray().OrderBy(s => Int32.Parse(Regex.Match(s.Name, @"quyen-(\d*)").Groups[1].Value)).ThenBy(s => Int32.Parse(Regex.Match(s.Name, @"chuong-(\d*)\.html").Groups[1].Value));
    
    foreach (FileInfo f in files1)
    {
         Console.WriteLine(f.Name);
    }
    foreach (FileInfo f in files2)
    {
         Console.WriteLine(f.Name);
    }

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi nguyen930411
    Bạn thử code này xem:

    Mã:
    var files1 = new DirectoryInfo(@"D:\folder1").GetFiles().ToArray().OrderBy(s => Int32.Parse(Regex.Match(s.Name, @"(\d*)\.html").Groups[1].Value));
    var files2 = new DirectoryInfo(@"D:\folder2").GetFiles().ToArray().OrderBy(s => Int32.Parse(Regex.Match(s.Name, @"quyen-(\d*)").Groups[1].Value)).ThenBy(s => Int32.Parse(Regex.Match(s.Name, @"chuong-(\d*)\.html").Groups[1].Value));
    
    foreach (FileInfo f in files1)
    {
         Console.WriteLine(f.Name);
    }
    foreach (FileInfo f in files2)
    {
         Console.WriteLine(f.Name);
    }
    Cảm ơn bạn. code của bạn sau khi mình eidt đường dẫn và thử nghiệm thì rất thành công [IMG]images/smilies/smile.png[/IMG]
    Bạn có thể giải thích 2 lệnh này giùm mình được không ?
    Mã:
    var files1 = new DirectoryInfo(@"D:\folder1").GetFiles().ToArray().OrderBy(s => Int32.Parse(Regex.Match(s.Name, @"(\d*)\.html").Groups[1].Value));
    var files2 = new DirectoryInfo(@"D:\folder2").GetFiles().ToArray().OrderBy(s => Int32.Parse(Regex.Match(s.Name, @"quyen-(\d*)").Groups[1].Value)).ThenBy(s => Int32.Parse(Regex.Match(s.Name, @"chuong-(\d*)\.html").Groups[1].Value));
    Phần từ sau . Orderby ấy

    - - - Nội dung đã được cập nhật ngày 30-12-2015 lúc 03:56 PM - - -

    Trích dẫn Gửi bởi Van8Hien62
    Nói như bạn là huề ! quy luật sắp xếp theo tên của explorer mỗi PC mỗi khác (tùy chọn / Customize).
    Bạn không mô tả được quy luật sắp xếp bạn muốn ?
    //
    Msdn :

    Mã:
    public static void Sort(    Array array,    IComparer comparer)
    //
    Mô tả và viết lại :
    int IComparer.Compare( Object x, Object y ) {
    //....
    }
    là xong.

    Ngoài ra có nhiều giải pháp khác.
    Thì mình đã nói rõ rồi còn gì.

    Mục đích của mình là các file nó sẽ nằm đúng thứ tự vốn có của nó
    với các file tên dạng số thì số sẽ từ nhỏ tới lớn còn với các file có quyen-xx-chuong-xxx thì cũng tương tự vậy
    nhưng nếu sữ dụng lệnh của mình thì nó sẽ sắp xếp theo 1,10,100,2,20,200

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Theo mình biết thì(sai thì rep lại giúp mình nha =.=):
    + Trong OrderBy là hàm vô danh, bạn nghiên cứu thêm về "biểu thức lambda", "anonymous method" để biết thêm.
    + Trước dấu "=>" là tham số.
    + Sau dấu "=>" là nội dung hàm, đáng lẽ có dấu {} nhưng do chỉ 1 dòng lệnh nên không cần.
    + Regex.Match(s.Name, @"(\d*)\.html").Groups[1].Value -> phần Regex nếu bạn chưa biết thì search thêm nhé, group[1] là lấy vị trí (\d*)...group[1].value là lấy giá trị ra.
    + ThenBy được dùng sau OrderBy, là điều kiện sort thứ 2.
    + Mặc định OrderBy là sort tăng dần, nếu bạn muốn giảm dần thì thêm dấu "-" trước Int32.Parse.

    Kiến thức mình còn hổng nhiều lắm, bạn xem thêm trên mạng nhé: https://msdn.microsoft.com/library/bb534966(v=vs.100).aspx

    Có gì add fb mình sẽ nói chi tiết hơn: [email protected]

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Van8Hien62
    Nói như bạn là huề ! quy luật sắp xếp theo tên của explorer mỗi PC mỗi khác (tùy chọn / Customize).
    Bạn không mô tả được quy luật sắp xếp bạn muốn ?
    //
    Msdn :

    Mã:
    public static void Sort(    Array array,    IComparer comparer)
    //
    Mô tả và viết lại :
    int IComparer.Compare( Object x, Object y ) {
    //....
    }
    là xong.

    Ngoài ra có nhiều giải pháp khác.
    Trích dẫn Gửi bởi nguyen930411
    Theo mình biết thì(sai thì rep lại giúp mình nha =.=):
    + Trong OrderBy là hàm vô danh, bạn nghiên cứu thêm về "biểu thức lambda", "anonymous method" để biết thêm.
    + Trước dấu "=>" là tham số.
    + Sau dấu "=>" là nội dung hàm, đáng lẽ có dấu {} nhưng do chỉ 1 dòng lệnh nên không cần.
    + Regex.Match(s.Name, @"(\d*)\.html").Groups[1].Value -> phần Regex nếu bạn chưa biết thì search thêm nhé, group[1] là lấy vị trí (\d*)...group[1].value là lấy giá trị ra.
    + ThenBy được dùng sau OrderBy, là điều kiện sort thứ 2.
    + Mặc định OrderBy là sort tăng dần, nếu bạn muốn giảm dần thì thêm dấu "-" trước Int32.Parse.

    Kiến thức mình còn hổng nhiều lắm, bạn xem thêm trên mạng nhé: https://msdn.microsoft.com/library/bb534966(v=vs.100).aspx

    Có gì add fb mình sẽ nói chi tiết hơn: [email protected]
    Cảm ơn bạn [IMG]images/smilies/smile.png[/IMG] mình đang cố gắng nghiên cứu cái lệnh của bạn đây
    vì mình có 3 trường hợp lại chưa biết đúng trường hợp nào nên mình đặt vòng if.
    Đang fix những lỗi mà nó xảy ra khi nhét vào =))

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi nguyen930411
    Theo mình biết thì(sai thì rep lại giúp mình nha =.=):
    + Trong OrderBy là hàm vô danh, bạn nghiên cứu thêm về "biểu thức lambda", "anonymous method" để biết thêm.
    + Trước dấu "=>" là tham số.
    + Sau dấu "=>" là nội dung hàm, đáng lẽ có dấu {} nhưng do chỉ 1 dòng lệnh nên không cần.
    + Regex.Match(s.Name, @"(\d*)\.html").Groups[1].Value -> phần Regex nếu bạn chưa biết thì search thêm nhé, group[1] là lấy vị trí (\d*)...group[1].value là lấy giá trị ra.
    + ThenBy được dùng sau OrderBy, là điều kiện sort thứ 2.
    + Mặc định OrderBy là sort tăng dần, nếu bạn muốn giảm dần thì thêm dấu "-" trước Int32.Parse.

    Kiến thức mình còn hổng nhiều lắm, bạn xem thêm trên mạng nhé: https://msdn.microsoft.com/library/bb534966(v=vs.100).aspx

    Có gì add fb mình sẽ nói chi tiết hơn: [email protected]
    Vài chổ của bạn @nguyen930411 sai nhé.

    1/. OrderBy KHÔNG phải là hàm vô danh (not an anonymous method). Đó là extension method (tiếng Việt là hàm mở rộng, nhưng theo mình thì nên hiểu theo nghĩa extension, đừng dịch ra làm gì).

    Kiểu trả về (returned type) của OrderBy là IOrderedEnumerable<TSource>, được declare trong class Enumerable. Cụ thể:


    Mã:
    public static class Enumerable{    //    // Summary:    //     Sorts the elements of a sequence in ascending order according to a key.    //    // Parameters:    //   source:    //     A sequence of values to order.    //    //   keySelector:    //     A function to extract a key from an element.    //    // Type parameters:    //   TSource:    //     The type of the elements of source.    //    //   TKey:    //     The type of the key returned by keySelector.    //    // Returns:    //     An System.Linq.IOrderedEnumerable`1 whose elements are sorted according to a    //     key.    //    // Exceptions:    //   T:System.ArgumentNullException:    //     source or keySelector is null.    public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);}
    Extension method có 2 loại: 1 loại chấp nhận parameter và 1 loại không chấp nhận parameter.

    Ví du:


    Mã:
    // none parametervar item = list.First(); // Lấy item đầu tiên trong list // one parametervar _item = list.First(x => x == "abc"); // Lấy item đầu tiên trong các item mà có giá trị (value) là abc
    2/. OrderBy vì không là anonymous method nên không thể viết theo cú pháp: list.OrderBy(x => { x }). Chổ này sao bạn không check thử trước khi up bài nhỉ?
    Đúng là anonymous method có chấp nhận cú pháp đó, nhưng OrderBy không là anonymous method.

    3/. Nếu nói theo cách của anonymous method thì câu khẳng định: Trước dấu "=>" là tham số là không chính xác.
    Anonymous method có thể có nhiều hơn 1 tham số, hoặc không.

    Ví dụ:


    Mã:
    Action action = () =>{   // anonymous method with none argument   Console.WriteLine("Hello World!");}; // hoặc đơn giản hơn là:Action _action = () => Console.WriteLine("Hello World!"); Action<string> action1 = x =>{   // anonymous method with 1 argument   Console.WriteLine(x);}; Action<int, int> action2 = (x, y) =>{   // anonymous method with 2 arguments   Console.WriteLine(x + y);};
    Ngoài ra, bạn còn có thể declare 1 extension method tương tự như OrderBy để dùng:


    Mã:
    public static IOrderedEnumerable<TSource> AnotherOrderByMe<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector){   //do stuff...}


    Áp dụng cho topic này:


    Mã:
    public static class MyExtensions{    public static IEnumerable<string> OrderByMe(this IEnumerable<string> list)    {        int maxLen = list.Select(s => s.Length).Max();         return list.Select(s => new        {            OrgStr = s,            SortStr = Regex.Replace(s, @"(\d+)|(\D+)", m => m.Value.PadLeft(maxLen, char.IsDigit(m.Value[0]) ? ' ' : '\xffff'))        })        .OrderBy(x => x.SortStr)        .Select(x => x.OrgStr);    }} public class MyClass{    public static void Main(string[] args)    {        var files = new List<string>(Directory.EnumerateFiles(@"F:\Download\images\", "*.txt"));        files.OrderByMe().ToList().ForEach(x => Console.WriteLine(x));        Console.ReadLine();    }}


    Ghi chú: Từ .Net version 4.0 trở về sau, bạn có thể dùng EnumerateFiles thay cho GetFiles nhé.

    Thân!

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    OrderBy vì không là anonymous method nên không thể viết theo cú pháp: list.OrderBy(x => { x }). Chổ này sao bạn không check thử trước khi up bài nhỉ?
    Sử dụng {} được nha bạn, nhưng phải return giá trị về.

    Đúng là mình còn non quá...tks bạn đã chỉ giáo [IMG]images/smilies/wings_blink.gif[/IMG]

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •