-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
84 lines (67 loc) · 2.31 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System.Diagnostics;
using System.Text.Json;
using SimpleSearchEngine;
var searchEngine = new SearchEngine<Movie>();
var movies = GetMovies();
searchEngine.Index(movies, x => x.Fields.Title);
var linqIndex = movies.Where(x => !string.IsNullOrWhiteSpace(x.Fields.Title))
.Select(x => new LinqIndexEntry()
{
Words = x.Fields.Title.Split(new[] { ' ', '\n', '\r', '\t', '-' }, StringSplitOptions.RemoveEmptyEntries),
Movie = x
})
.ToList();
while (true)
{
Console.Write("Enter search term: ");
var searchTerm = Console.ReadLine();
if (string.IsNullOrEmpty(searchTerm))
break;
// ---------- SEARCH ENGINE SEARCH ----------------
Console.WriteLine("Using search engine");
Console.WriteLine("===================");
var searchResults = searchEngine.Search(searchTerm);
foreach (var result in searchResults)
Console.WriteLine("*** {0}", result.Fields.Title);
Console.WriteLine("{0} results ({1} seconds)", searchResults.Count(), searchResults.Elapsed.TotalSeconds.ToString("0.00####################"));
Console.WriteLine();
// ---------- LINQ SEARCH ----------------
Console.WriteLine("Using LINQ");
Console.WriteLine("==========");
var stopwatch = Stopwatch.StartNew();
var results = linqIndex.Where(x => x.Words.Any(e => e.StartsWith(searchTerm, StringComparison.InvariantCultureIgnoreCase))).ToList();
stopwatch.Stop();
foreach (var result in results)
Console.WriteLine("*** {0}", result.Movie.Fields.Title);
Console.WriteLine("{0} results ({1} seconds)", results.Count(), stopwatch.Elapsed.TotalSeconds.ToString("0.00####################"));
Console.WriteLine();
}
static Movie[] GetMovies()
{
var json = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "moviedata.json"));
return JsonSerializer.Deserialize<Movie[]>(json, new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = true
}) ?? Array.Empty<Movie>();
}
class LinqIndexEntry
{
public string[] Words { get; set; }
public Movie Movie { get; set; }
}
class Movie
{
public string Type { get; set; }
public string Id { get; set; }
public int Version { get; set; }
public string Lang { get; set; }
public Fields Fields { get; set; }
}
class Fields
{
public string Title { get; set; }
public int? Year { get; set; }
public string Director { get; set; }
public string[] Genre { get; set; }
public string[] Actor { get; set; }
}