-
Notifications
You must be signed in to change notification settings - Fork 7
/
CharIListExtensions.cs
74 lines (71 loc) · 3.7 KB
/
CharIListExtensions.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
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace Platform.Collections.Lists
{
/// <summary>
/// <para>
/// Represents the char list extensions.
/// </para>
/// <para></para>
/// </summary>
public static class CharIListExtensions
{
/// <summary>
/// <para>Generates a hash code for the entire list based on the values of its elements.</para>
/// <para>Генерирует хэш-код всего списка, на основе значений его элементов.</para>
/// </summary>
/// <param name="list"><para>The list to be hashed.</para><para>Список для хеширования.</para></param>
/// <returns>
/// <para>The hash code of the list.</para>
/// <para>Хэш-код списка.</para>
/// </returns>
/// <remarks>
/// Based on https://github.com/Microsoft/referencesource/blob/3b1eaf5203992df69de44c783a3eda37d3d4cd10/mscorlib/system/string.cs#L833
/// </remarks>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int GenerateHashCode(this IList<char> list)
{
var hashSeed = 5381;
var hashAccumulator = hashSeed;
for (var i = 0; i < list.Count; i++)
{
hashAccumulator = (hashAccumulator << 5) + hashAccumulator ^ list[i];
}
return hashAccumulator + (hashSeed * 1566083941);
}
/// <summary>
/// <para>Compares two lists for equality.</para>
/// <para>Сравнивает два списка на равенство.</para>
/// </summary>
/// <param name="left"><para>The first compared list.</para><para>Первый список для сравнения.</para></param>
/// <param name="right"><para>The second compared list.</para><para>Второй список для сравнения.</para></param>
/// <returns>
/// <para>True, if the passed lists are equal to each other оtherwise false.</para>
/// <para>True, если переданные списки равны друг другу, иначе false.</para>
/// </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool EqualTo(this IList<char> left, IList<char> right) => left.EqualTo(right, ContentEqualTo);
/// <summary>
/// <para>Compares each element in the list for equality.</para>
/// <para>Сравнивает на равенство каждый элемент списка.</para>
/// </summary>
/// <param name="left"><para>The first compared list.</para><para>Первый список для сравнения.</para></param>
/// <param name="right"><para>The second compared list.</para><para>Второй список для сравнения.</para></param>
/// <returns>
/// <para>If at least one element of one list is not equal to the corresponding element from another list returns false, otherwise - true.</para>
/// <para>Если как минимум один элемент одного списка не равен соответствующему элементу из другого списка возвращает false, иначе - true.</para>
/// </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool ContentEqualTo(this IList<char> left, IList<char> right)
{
for (var i = left.Count - 1; i >= 0; --i)
{
if (left[i] != right[i])
{
return false;
}
}
return true;
}
}
}