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>.
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(); } } }
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();
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.