Avatar billede hanzi_cool Nybegynder
15. marts 2009 - 21:57 Der er 4 kommentarer og
1 løsning

Linq: Hvordan finder jeg blog indlæg som indeholder nogle valgte tags

Jeg er i gang med at lave en blog i c# med linq til xml, og det driller sku lidt :)

Jeg er i gang med at lave en søge funktion, hvor man skal kunne vælge et eller flere tags, derefter skal de posts, som har de valgte tags blive vist.

Jeg har en liste med alle blog artiklerne:
List<Post> posts
"Post" class'en inholder en List<Tag> som hedder Tags.

Og jeg har en liste med de valgte tags:
List<Tag> tags


Håber nogle derude kan hjælpe mig med at trække en List<Post> som kun indeholder de post med de valgte tags.

På forhånd tak for hjælpen..
Avatar billede arne_v Ekspert
15. marts 2009 - 22:05 #1
Kan du beskrive data lidt mere præcist. LINQ har glimrende muligheder for at udvælge data, men det er svært at sige noget præcist udfra ovenstående.
Avatar billede hanzi_cool Nybegynder
15. marts 2009 - 23:04 #2
Jeg prøver igen så :)

Jeg har to classes: Post og Tag.
Post class'en ser sådan ud:
public class Post
{
        public int ID;
        public string Title;
        public List<Tag> Tag;
        ......
}

(Jeg bruger self. get/set, men har fjernet det for at gøre koden kortere)

Tag class'en ser sådan her ud:
public class Tag
{
    public int ID
    public string Value
}

Jeg har lavet alt, der har med at load xml dataen ind i generic lists, men nu skal jeg have lavet en funktion, hvor jeg skal have den til kun at finde de posts, hvor som har nogle specifikke tags.


jeg har prøvet med:
public static List<Post> GetPostsByTags(List<Tag> tags)
{
    List<Post> posts = GetAllPosts();
    return posts.Where(p => p.Tags.Contains(tags);
}

Problemet er her, at Contains kun tager et Tag og ikke List<Tag>.


Håber det var bedre forklaret... :)
Avatar billede arne_v Ekspert
16. marts 2009 - 00:51 #3
Ja - nu er det klart.

Du skal bruge Intersects fremfor Contains !

Et lille eksempel meget ligende dit:

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

namespace E
{
    public class Data
    {
        public int Id { get; set; }
        public List<string> Vals { get; set; }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            List<Data> total = new List<Data> {
                new Data { Id=1, Vals=new List<string> { "A", "X", "Y" }},
                new Data { Id=2, Vals=new List<string> { "A", "B", "C" }},
                new Data { Id=3, Vals=new List<string> { "D", "X", "Y" }}
            };
            List<string> targets = new List<string>{ "A", "B", "C" };
            // all match
            foreach(Data d in total.Where((o) => o.Vals.Intersect(targets).Count() == targets.Count))
            {
                Console.WriteLine(d.Id);
            }
            // at least one match
            foreach(Data d in total.Where((o) => o.Vals.Intersect(targets).Count() > 0))
            {
                Console.WriteLine(d.Id);
            }
            // none match
            foreach(Data d in total.Where((o) => o.Vals.Intersect(targets).Count() == 0))
            {
                Console.WriteLine(d.Id);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede hanzi_cool Nybegynder
16. marts 2009 - 16:01 #4
Perfekt! Det var lige den funktion, som jeg skulle bruge.

Det skal dog siges, at jeg blev nødt til at lave lidt comparer halløj, så jeg kunne sammenligne to tag's, men det var hurtigt gjort med lidt hjælp fra google :)

Smid et svar og tusinde tak. Det har sparret mig for meget hiven i håret :)

public class Tag : IEquatable<Tag>
{
    public int ID
    public string Value

        public bool Equals(Tag other)
        {
            if (Object.ReferenceEquals(other, null)) return false;

            if (Object.ReferenceEquals(this, other)) return true;

            return ID.Equals(other.ID);
        }

        // If Equals returns true for a pair of objects,
        // GetHashCode must return the same value for these objects.

        public override int GetHashCode()
        {
            // Get the hash code for the ID field.
            int hashProductID = ID.GetHashCode();

            return hashProductID;
        }

}
Avatar billede arne_v Ekspert
16. marts 2009 - 16:10 #5
svar
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