Avatar billede mibin Nybegynder
28. marts 2009 - 14:05 Der er 3 kommentarer og
1 løsning

Finde længste matchende sti (LINQ?)

Hej,

Jeg har en metode med et argument hvor jeg ønsker at søge i en database og finde den længste sti der matcher argumentet. Et eksempel kunne være at databasen indeholder:

/Default.aspx
/SignIn.aspx
/Admin/
/Admin/Default.aspx

Hvis jeg kalder med argumentet '/Admin/Default.aspx' ønsker jeg selvfølgelig at få fat i den tilsvarende post. Hvis jeg søger på '/Admin/Something.aspx' ønsker jeg at få fat i posten med '/Admin/'. Jeg er i tvivl om hvorvidt det kan laves med LINQ. Har forsøgt med følgende, men det virker ikke.

public PathDto GetByRelativePath(String relativePath)
        {
            PathDto dto;

            using (DataContext dc = GetDataContext())
            {
                var query =
                    from dtos in dc.GetTable<PathDto>()
                    where relativePath.Contains(dtos.RelativePath)
                    orderby dtos.RelativePath.Length descending
                    select dtos;

                dto = query.Count().Equals(0) ? null : query.First();
            }

            return dto;
        }

Jeg får blot

Only arguments that can be evaluated on the client are supported for the String.Contains method.

Nogen forslag?
Avatar billede arne_v Ekspert
28. marts 2009 - 14:55 #1
Nu har jeg ikke dine database klasser, men følgende LINQ to objects eksempel viser noget:

using System;
using System.Collections.Generic;
using System.Linq;

namespace E
{
    public class Program
    {
        public static string FindBestMatch(IEnumerable<string> lst, string target)
        {
            var q = lst.Where((s) => target.StartsWith(s));
            return q.First((s) => s.Length == q.Select((s2) => s2.Length).Max());
        }
        public static void Main(string[] args)
        {
            List<string> sa = new List<string>{ "/Default.aspx", "/SignIn.aspx", "/Admin/", "/Admin/Default.aspx" };
            Console.WriteLine(FindBestMatch(sa, "/Admin/Default.aspx"));
            Console.WriteLine(FindBestMatch(sa, "/Admin/Something.aspx"));
        }
    }
}
Avatar billede mibin Nybegynder
28. marts 2009 - 15:18 #2
Perfekt! Smid et svar.
Avatar billede arne_v Ekspert
28. marts 2009 - 15:22 #3
svar
Avatar billede Syska Mester
31. marts 2009 - 20:57 #4
nok mest til arne_v den her ...

Nogen fordel i den her måde ?
return q.First((s) => s.Length == q.Select((s2) => s2.Length).Max());

Min udmildbare logiske måde at gøre det på ville være med OrderBy ?
Tænker mere på hvordan .NET ville gøre det hele internt ?

OrderDecedingBy(a => a.Length).First();

Sådan lidt offtopic, synes bare det var en sjov og lang måde at hive det længeste match ud på ... :-)
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