const string path = "file.txt";
var scores =
File.ReadLines(path)
.Select(line => line.Split(' '))
.ToDictionary(arr => arr[0], data => int.Parse(data[1]));
const string path = "file.txt";
var scores =
File.ReadLines(path)
.Select(line => line.Split(' '))
.Select(arr => new { key = arr[0], value = int.Parse(arr[1]) })
.ToDictionary(k => k.key, v => v.value);
open System
open System.Text.RegularExpressions
open System.Text
open System.Diagnostics
module String =
let print = printfn "%s"
let useSubString x (pattern:string) =
let rec loop (source:string) count =
let index = source.IndexOf pattern
if source.IndexOf pattern < 0 then count
else
count + 1 |> loop (source.Substring (index + pattern.Length))
loop x 0
let useRemove x (pattern:string) =
let rec loop (source:string) count =
let index = source.IndexOf pattern
if source.IndexOf pattern < 0 then count
else
count + 1 |> loop (source.Remove(index, pattern.Length))
loop x 0
let useSplit (x:string) (pattern:string) =
x.Split([| pattern |], StringSplitOptions.None).Length - 1
let useRegexp x (pattern:string) = Regex(pattern).Matches(x).Count
let sample() =
let src = "тук - тук!"
let ptn = "тук"
[
"useSubString", String.useSubString
"useRemove", String.useRemove
"useSplit", String.useSplit
"useRegexp", String.useRegexp
]
|> List.map(fun (n,f) ->
f src ptn |> sprintf "'%s' found on '%s' use '%s'\t %i times..." ptn src n
)
|> List.iter String.print
let rnd = Random()
let genPattern() =
let l = rnd.Next(10, 20)
(StringBuilder(), [0..l - 1])
||> List.fold (fun sb _ -> sb.Append('A').Append(rnd.Next 26))
let pattren = genPattern().ToString()
let fill n =
Array.init n (fun _ ->
let l = rnd.Next(10, 20)
(StringBuilder(), [0..l - 1])
||> List.fold (fun sb _ ->
if (rnd.Next(0, 7) % 3 <> 0) then
sb.Append('A').Append(rnd.Next 26)
else
sb.Append pattren
)
|> fun sb -> sb.ToString()
)
let bench() =
let n = 1_000_000
// массивы что бы убрать влияние динамического создания объектов
let uss = Array.zeroCreate n
let urm = Array.zeroCreate n
let usp = Array.zeroCreate n
let urx = Array.zeroCreate n
let sw = Stopwatch()
sw.Start()
let sources = fill(n)
let tsf = sw.Elapsed
sw.Reset()
sw.Start()
for i in 0..n-1 do
uss.[i] <- String.useSubString sources.[i] pattren
let tss = sw.Elapsed
sw.Reset()
sw.Start()
for i in 0..n-1 do
urm.[i] <- String.useRemove sources.[i] pattren
let trm = sw.Elapsed
sw.Reset()
sw.Start()
for i in 0..n-1 do
usp.[i] <- String.useSplit sources.[i] pattren
let tsp = sw.Elapsed
sw.Reset()
sw.Start()
for i in 0..n-1 do
urx.[i] <- String.useRegexp sources.[i] pattren
let trx = sw.Elapsed
sw.Stop()
// весь вывод выносим за пределы замера
[
sprintf "fill\t\t %s" <| tsf.ToString(@"hh\:mm\:ss\.fffff")
sprintf "useSubString\t %s" <| tss.ToString(@"hh\:mm\:ss\.fffff")
sprintf "useRemove\t %s" <| trm.ToString(@"hh\:mm\:ss\.fffff")
sprintf "useSplit\t %s" <| tsp.ToString(@"hh\:mm\:ss\.fffff")
sprintf "useRegexp\t %s" <| trx.ToString(@"hh\:mm\:ss\.fffff")
] |> List.iter String.print
// выод размерности массивов, или чек, что бы сборщик мусора не успел возбудиться ))
printfn "%i %i %i %i" uss.Length urm.Length usp.Length urx.Length
sample()
bench()
Foggy Finder, вы вообще фигню написали
я по-другому решил
private void PictureBox1_MouseClick(object sender, MouseEventArgs e)
{
int currentX = e.X;
int currentY = e.Y;
bool exist =
objects
.Any(o =>
currentX > (o.X - o.Width / 2) && currentX < (o.X + o.Width / 2) &&
currentY > (o.Y - o.Height / 2) && currentY < (o.Y + o.Height / 2));
}
а переписать на F# мой "бенчмарк".. хлопотно? было бы любопыт
class Program
{
static void Main() => BenchmarkRunner.Run<Benchmark>();
}
[MemoryDiagnoser]
public class Benchmark
{
static Random rnd = new Random();
static string GenPattern()
{
var l = rnd.Next(10, 20);
var sb = new StringBuilder();
for (var i = 0; i < l; i++)
sb.Append((char)('A' + rnd.Next(0, 26)));
return sb.ToString();
}
static string GenSource(string pattern)
{
var l = rnd.Next(100, 200);
var sb = new StringBuilder();
for (var j = 0; j < l; j++)
if (rnd.Next(0, 7) % 3 != 0)
sb.Append((char)('A' + rnd.Next(0, 26)));
else
sb.Append(pattern);
return sb.ToString();
}
[IterationSetup]
public void Setup()
{
pattern = GenPattern();
source = GenSource(pattern);
}
string source;
string pattern;
[Benchmark]
public int UseSubstring()
{
var count = 0;
while (true)
{
var index = source.IndexOf(pattern);
if (index < 0)
return count;
source = source.Substring(index + pattern.Length);
count++;
}
}
[Benchmark]
public int UseRemove()
{
var count = 0;
while (true)
{
var index = source.IndexOf(pattern);
if (index < 0)
return count;
source = source.Remove(index, pattern.Length);
count++;
}
}
[Benchmark]
public int UseIndex()
{
int c = 0, i = -pattern.Length;
while ((i = source.IndexOf(pattern, i + pattern.Length)) > -1) ++c;
return c;
}
[Benchmark]
public int UseSplit()
=> source.Split(new string[] { pattern }, StringSplitOptions.None).Length - 1;
[Benchmark]
public int UseRegexp()
=> new Regex(pattern).Matches(source).Count;
[Benchmark]
public int UseReplace()
=> (source.Length - source.Replace(pattern, "").Length) / pattern.Length;
}
но вот что сплит всех уделает "как бог черепаху" искренне не ожидал ))
Общее представление об асихронных методах можно получить тут:
Асинхронные методы, async и await