Avatar billede Henning3 Nybegynder
24. juni 2010 - 20:53 Der er 10 kommentarer og
1 løsning

Metode til at tjekke tekst streng

Hejsa
Jeg har brug for en metode, som kan checke to input params. Hvis input2 indeholder de samme ord som input 1, så skal de ord fjernes i input2 strengen.

Noget ala:

input1 = Niels Hansen
input2 = Hansen

public string FilterStringDuplicates(string input1, string input2)
{
  string returnValue = string.Empty;

  ....................?

  return returnValue;
}

returnValue = Niels Hansen

Takker.

Mvh H.
Avatar billede arne_v Ekspert
24. juni 2010 - 21:21 #1
Jeg kan ikke faa din tekst og dit eksempel til at matche.

Men her et eksempel som jeg tror matcher teksten:

using System;
using System.Linq;

namespace E
{
    public class Program
    {
        public static string FilterStringDuplicates(string input1, string input2)
        {
            return input2.Split(' ').Except(input1.Split(' ')).Aggregate((s1,s2) => s1 + ' ' + s2);
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(FilterStringDuplicates("Hansen", "Niels Hansen"));
            Console.WriteLine(FilterStringDuplicates("DD BB", "AA BB CC DD EE"));
            Console.ReadKey();
        }
    }
}
Avatar billede Henning3 Nybegynder
25. juni 2010 - 09:37 #2
wow... et Linq kald! :-) Det har jeg stadig ik fattet, men det er smart!

har testet metoden og det ser ud til at virke indtil input1 og input2 er nøjagtig ens.

Så får jeg denne fejl: "Sequence contains no elements error".

Kan man lave et smart Linq check på om input1 og input2 er ens?
Avatar billede arne_v Ekspert
25. juni 2010 - 16:12 #3
Hm.

Aggregate giver tilsyneladende problemer med ingen elementer.

Den primitive loesning er:

        public static string FilterStringDuplicates(string input1, string input2)
        {
            IEnumerable<string> dif = input2.Split(' ').Except(input1.Split(' '));
            if(dif.Count() > 0)
            {
                return dif.Aggregate((s1,s2) => s1 + ' ' + s2);
            }
            else
            {
                return "";
            }
        }
Avatar billede arne_v Ekspert
25. juni 2010 - 16:15 #4
Men det kan goeres bedre:

        public static string FilterStringDuplicates(string input1, string input2)
        {
            return string.Join(" ", input2.Split(' ').Except(input1.Split(' ')).ToArray());
        }
Avatar billede arne_v Ekspert
25. juni 2010 - 16:15 #5
og et svar
Avatar billede Henning3 Nybegynder
27. juni 2010 - 20:28 #6
hejsa

har testet dit eksempel men det virker ikke helt efter hensigten.

nu tager lige et copy paste fra mit test data.

felter i DB tbl.

-----------------------------------------------------
felt1          |  felt2                   
-----------------------------------------------------
Bodegas Mauro  |  Mauro Vendimia Seleccionada
-----------------------------------------------------

Output med dit sidste eksempel: Bodegas

Det ønskede output: Bodegas Mauro Vendimia Seleccionada

så det er Mauro  der skal fjernes fra felt2, fordi det indgår i felt1.
Avatar billede arne_v Ekspert
27. juni 2010 - 20:41 #7
Du vil merge felterne og bare undgå duplikater?
Avatar billede arne_v Ekspert
27. juni 2010 - 20:46 #8
Så prøv:

        public static string FilterStringDuplicates(string input1, string input2)
        {
            return string.Join(" ", input1.Split(' ').Concat(input2.Split(' ').Where(s => !input1.Split(' ').Contains(s))).ToArray());
        }
Avatar billede Henning3 Nybegynder
29. juni 2010 - 09:43 #9
jeg binder mine data til custom entity classes. Så selve mergingen håndtere jeg selv. Jeg vil kun undgå duplikater (fjerne ord i felt2, som matcher/også findes i felt1.

raw data fra DB: Bodegas Mauro | Mauro Vendimia Seleccionada

vil gerne vise det sådan: Bodegas Mauro | Vendimia Seleccionada

I min RowDataBound event metode, binder jeg entity klassens props. til en hyperlink og label kontroller m.m.:

string name = StringUtil.RemoveDuplicateStrings(wine, winery);
link.Text = name;

så det der kommer ind i metoden er:

StringUtil.RemoveDuplicateStrings("Bodegas Mauro","Mauro Vendimia Seleccionada");

Outputtet på dit sidste eksempel er: Mauro Bodegas
Avatar billede arne_v Ekspert
29. juni 2010 - 22:00 #10
Hvis du kun vil fjerne duplikaterne saa skal du bruge loesningen i #4.

Vil du baade merge og fjerne duplikater skal du bruge loesningen fra #8.
Avatar billede Henning3 Nybegynder
30. juni 2010 - 12:49 #11
du har ret, det kører bare med #4.

takker igen!
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
Kurser inden for grundlæggende programmering

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