Diskuze: Řazení

C# .NET .NET (C# a Visual Basic) Řazení American English version English version

Aktivity (1)
Avatar
Criess
Člen
Avatar
Criess:18.11.2016 10:03

Ahoj, potřebuji seřadit jména souborů takto: malá písmena mají přednost před velkými, písmena mají přednost před číslicemi. Nenapadá mě žádný rozumný způsob.

 
Odpovědět 18.11.2016 10:03
Avatar
Odpovídá na Criess
Michal Štěpánek:18.11.2016 10:12

Nejsem si jistý, jestli vůbec taková možnost existuje...

Nahoru Odpovědět 18.11.2016 10:12
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Criess
Člen
Avatar
Criess:18.11.2016 10:31

No mě napadly dva cykly v sobě a porovnávat ty dva znaky podle hodnoty v ascii, ale to potřebuje dost ifů na ošetření všech možností...

 
Nahoru Odpovědět 18.11.2016 10:31
Avatar
Lukas C#
Redaktor
Avatar
Odpovídá na Criess
Lukas C#:18.11.2016 11:57

Vytvoř si svoji vlastní "ASCII" tabulku (asi pole charů), kde budou první malá, poté velká píšmena, a poté číslice. Pak bys asi mohl porovnávat podle pozice v této vlastní tabulce.

 
Nahoru Odpovědět  +3 18.11.2016 11:57
Avatar
Radek Chalupa:18.11.2016 13:22

Můžeš použít WinAPI funkci StrCmpC, viz příklad:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace Trideni
{
        class MujComparer : IComparer<string>
        {
                [DllImport("Shlwapi.dll")]
                public static extern int StrCmpC(string s1, string s2);

                public int Compare(string s1, string s2)
                {
                        return StrCmpC(s1, s2);
                }
        };

        class Program
        {
                static void Main(string[] args)
                {
                        MujComparer mc = new MujComparer();
                        List<string> ls = new List<string>();
                        ls.Add("98");
                        ls.Add("abc");
                        ls.Add("ABC");
                        ls.Add("z");
                        ls.Add("12");
                        ls.Add("ZZ");
                        ls.Sort(mc);
                        foreach (string s in ls)
                        {
                                Console.WriteLine(s);
                        }
                        Console.ReadLine();
                }
        }
}

Radek Chalupa

  • individuální konzultace, školení programování (C/C++, C#, WinAPI, .NET Framework, COM, ActiveX, ATL, MFC, ...)
  • vývoj software na zakázku

http://www.radekchalupa.cz

 
Nahoru Odpovědět 18.11.2016 13:22
Avatar
Marian Benčat
Redaktor
Avatar
Nahoru Odpovědět 18.11.2016 13:54
"C# 3.0 (2007) volal Java 8 (2014), že chce svoje featury zpět"
Avatar
Criess
Člen
Avatar
Odpovídá na Lukas C#
Criess:19.11.2016 13:26

No, ale jak rychle zjistit, na jakém indexu se znak nachází?

 
Nahoru Odpovědět 19.11.2016 13:26
Avatar
Lukas C#
Redaktor
Avatar
Odpovídá na Criess
Lukas C#:19.11.2016 15:23

Není to asi nejúspornější a nejrychlejší, ale vzal bych na to Dictionary. Klíčem je CHAR, hodnotou je nová pozice ve tvojí vlastní code-table.

 
Nahoru Odpovědět  +1 19.11.2016 15:23
Avatar
HONZ4
Člen
Avatar
Odpovídá na Radek Chalupa
HONZ4:19.11.2016 19:49

Můžeš použít WinAPI funkci StrCmpC
to nemůže, protože on to chce řadit a,b,c,..A,B,C,­..1,2,3,..

 
Nahoru Odpovědět 19.11.2016 19:49
Avatar
Odpovídá na HONZ4
Radek Chalupa:19.11.2016 20:16

Může. Zkoušel jsi to a četl jsi popis té funkce? Řadí podle ASCII tabulky a v té jsou (z těch 3 skupin) nejníž čísla, pak velká písmena a pak malá písmena. A to zda bude mít a-A-1 nebo 1-A-a zvolí prohozením těch parametrů s1 s s2 v metodě Compare.

Radek Chalupa

  • školení programování, konzultace (C/C++, C#, WinAPI, .NET Framework, COM, ActiveX, ATL, MFC, ...)
  • vývoj software na zakázku

http://www.radekchalupa.cz

 
Nahoru Odpovědět  +1 19.11.2016 20:16
Avatar
HONZ4
Člen
Avatar
Odpovídá na Radek Chalupa
HONZ4:19.11.2016 20:23

on to sice v dotazu neuvedl, ale předpokládám, že mu bude vadit když Z bude níž než A

 
Nahoru Odpovědět 19.11.2016 20:23
Avatar
Odpovídá na HONZ4
Radek Chalupa:19.11.2016 20:37

To je pravda. V tom případě si musí poupravit ty názvy před tím než je předhodí tomu compareru, např. změnit malé znaky na velké a naopak a k číslům přidat nějakou hodnotu, aby byla nad malými písmeny.

Radek Chalupa

  • školení programování, konzultace (C/C++, C#, WinAPI, .NET Framework, COM, ActiveX, ATL, MFC, ...)
  • vývoj software na zakázku

http://www.radekchalupa.cz

 
Nahoru Odpovědět 19.11.2016 20:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.