public static IEnumerable <IndexedMeme> QueryTagCombination(string[] s, TagCombiner mode = TagCombiner.AND) { IEnumerable <IndexedMeme> tagQuery; switch (mode) { case TagCombiner.AND: tagQuery = _base.IndexedWhere(x => s.All(y => x.Tags.Contains(y))); break; case TagCombiner.NAND: tagQuery = _base.IndexedWhere(x => !s.All(y => x.Tags.Contains(y))); break; case TagCombiner.OR: tagQuery = _base.IndexedWhere(x => s.Any(y => x.Tags.Contains(y))); break; case TagCombiner.NOR: tagQuery = _base.IndexedWhere(x => !s.Any(y => x.Tags.Contains(y))); break; case TagCombiner.MAXCOUNT: var tempQuery = _base.Select(x => (x, x.Tags.Count(y => s.Contains(y)))); int maxMatch = tempQuery.Max(x => x.Item2); tagQuery = tempQuery.Where(x => x.Item2 == maxMatch).Select(x => new IndexedMeme(x.x, _base.IndexOf(x.x))); break; default: throw new NotImplementedException(mode.ToString() + " ist nicht implementiert"); } return(tagQuery); }
public static IndexedMeme ProcessTagCombination(string[] s, TagCombiner mode = TagCombiner.AND) { var tagQuery = QueryTagCombination(s, mode); if (!tagQuery.Any()) { return(new IndexedMeme(null, -1)); } var m = tagQuery.Rand(); return(m); }