Avatar billede mrpalermo Nybegynder
18. november 2010 - 12:31 Der er 10 kommentarer og
1 løsning

Filterfunktion for bogstaver

Har følgende definition af en kø;

Kø 1: aa-aå
Kø 2: ba-eå
Kø 3: fa-fm
Kø 4: fn-få
osv...

Jeg skal have smidt forskellige virksomhedsnavne i de rigtige køer, udfra hvad de første 2 bogstaver i firmanavnet starter med.

Findes der i frameworket en funktion som kan fortælle, om f.eks. bogstavkombinationen DR hører til kø 1,2,3 eller 4?

I bund og grund søger jeg noget i stil med

boolean CorrectQueue(string sInput, string sStartQueue, string sEndQueue)
{
  if(sInput between sStartQueue and sEndQueue)
    return true;
 
  return false;

}

Håber nogen kan guide mig i den rigtige retning, eller komme med et konkret svar.

Håber mit spørgsmål giver mening, ellers sig til.

Mvh. Peter
Avatar billede Syska Mester
18. november 2010 - 12:42 #1
Hvad kø ville "Eksperten" skulle i ... synes ikke jeg kan finde noget mønster i det du har skrevet.

mvh
Avatar billede mrpalermo Nybegynder
18. november 2010 - 13:01 #2
Kø 2.

Eksperten = EK

Kø 2 starter med BA og slutter med EÅ

Bogstav placering 1 = E, ligger efter B og før eller lig E
Bogstav placering 2 = K, ligger efter A og før Å

So..there you go!
Avatar billede arne_v Ekspert
18. november 2010 - 15:15 #3
Det borer kunne klare smed helt normal streng sammenligning.

Du skal bare huske at sammenlige:
  case insensitivt
  dk locale
Avatar billede mrpalermo Nybegynder
19. november 2010 - 09:49 #4
Hej Arne. Kan du være mere konkret? Evt. lave en sammenligningsstreng?
Avatar billede tjens Nybegynder
20. november 2010 - 00:56 #5
Forslag: (testes som consolapplikation)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SelectQueue
{
    static class Queues
    {
        static private List<string> Ql = new List<string>() { "BA", "FA", "FN", "G ", "K "};

      public static int selectQ(string name) {
            string NN = name.Substring(0, 2).ToUpperInvariant();
            return (NN.CompareTo("AA") == 0 ) ? 1 :
                Ql.Where(q => q.CompareTo(NN) < 1).Count() + 1;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Queues.selectQ("efg"));
            Console.WriteLine(Queues.selectQ(" fg"));
            Console.WriteLine(Queues.selectQ("Abc"));
            Console.WriteLine(Queues.selectQ("Aab"));
            Console.WriteLine(Queues.selectQ("JÅZ"));
            Console.WriteLine(Queues.selectQ("Kab"));
        }
    }
}

Forslaget kører ikke med fra/til grupper.
Når grupperne starter med BA, er det fordi alt der er mindre, ryger i gruppe 1.

Der er desværre et hack på AA, fordi windows sorterer den som Å.

Du kan bare tilføje flere grupper i listen i starten, uden at ændre i programmet

Prøv og se om det kan bruges.

PS: Jeg har først lært C# på kursus i denne uge, så andre eksperter må gerne rette mig: Jeg er her for at lære.
Avatar billede Syska Mester
20. november 2010 - 01:08 #6
Du kommer fra en java/c++ verden med de små bogstaver til dine methods ...

Det med AA til Å ... det klart hvis man bruger dansk culture.

mvh
Avatar billede tjens Nybegynder
20. november 2010 - 11:40 #7
Tak til buzzzz for tippet om culture:
Jeg fandt en måde at sammenligne strenge uden culture.

Samtidig fandt jeg ud af at man kan køre LINQ på Array, så det er ændret herunder for at gøre det så simpelt som muligt.

Og der er tilføjet en metode Test så output bliver nemmere at overskue:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SelectQueue
{
    static class Queues
    {
        static string[] Ql = { "BA", "F ", "FN", "G ", "K ", "PP", Char.MaxValue.ToString() };
       
        public static int SelectQ(string name)
        {
            string NN = name.Substring(0, 2).ToUpperInvariant();

            return Ql.Where(ZZ =>
                  ( string.Compare( ZZ, NN, StringComparison.Ordinal ) ) < 1 ).Count() + 1;
        }
    }

    class Program
    {
        static void Test(string[] names)
        {
            foreach (string n in names)
            {
                Console.WriteLine(Queues.SelectQ(n).ToString() + " : " + n );
            }
        }

        static void Main(string[] args)
        {
            Test(  new string[] { "F.Andersen", "FN", "FNA", "efg", "Abc", "AAB",
                                  "JÅZ", "Kab", "ZXY", "#FFFF", "Èspecial" } );
      }
    }
}
Avatar billede mrpalermo Nybegynder
22. november 2010 - 09:02 #8
Hej Tjens

Tak for dit indlæg. Jeg prøver lige skidtet af og vender tilbage.
Avatar billede mrpalermo Nybegynder
22. november 2010 - 10:03 #9
Den virker jo perfekt, Tjens.

Smid et svar..
Avatar billede tjens Nybegynder
22. november 2010 - 21:20 #10
Godt det kunne bruges.

Der kommer dog fejl på substring, hvis navnet er mindre end 2 tegn langt, så derfor er der her en udgave uden denne linie. (der er andre ændringer, så kopier alt)

Samtidig er Test ændret til at sortere input, så det er lettere at se om alt virker.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SelectQueue
{
    static class Queues
    {
        static string[] Qlist = { "BA", "F ", "FN", "G ", "K ", "PP", Char.MaxValue.ToString() };

        public static int SelectQ(string name)
        {
            return Qlist.Where(ZZ =>
                  (string.Compare(ZZ, name, StringComparison.OrdinalIgnoreCase)) < 1).Count() + 1;
        }
    }

    class Program
    {
        static void Test(string[] names)
        {
            Array.Sort(names, StringComparer.OrdinalIgnoreCase);
            foreach (string n in names)
            {
                Console.WriteLine(Queues.SelectQ(n).ToString() + " : " + n);
            }
        }

        static void Main(string[] args)
        {
            Test(new string[] { "F.Andersen", "FN", "FNA", "efg", "Abc", "AAB", "Q", "",
                                  "JÅZ", "Kab", "ZXY", "#FFFF", "Èspecial" });
        }
    }
}
Avatar billede arne_v Ekspert
28. november 2010 - 03:53 #11
Jeg ville som sagt bruge StringComparison.CurrentCultureIgnoreCase for at få dansk sortering.

Og så ville jeg nok ikke bruge LINQ.

    public class QueueSystem
    {
        private string[] qs;
        public QueueSystem(string[] qs)
        {
            this.qs = qs;   
        }
        public int Select(string name)
        {
            int res = 0;
            while(res < qs.Length
                  && string.Compare(name, qs[res], StringComparison.CurrentCultureIgnoreCase) >= 0)
            {
                res++;
            }
            return res + 1;
        }
    }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester