А не противоречит ли такая запись самой идее чистого кода?
str2.All
Все символы из str2 удовлетворяют условию str1.Count(y=>y==x)>=str2.Count(y=>y==x)
str1.Count(y=>y==x) >=
- в str1 количество искомых символов больше либо равноstr2.Count(y=>y==x)
- количеству искомых символов в str2// Эта функция считает, сколько раз каждый символ повторяется в строке
static Dictionary<char, int> CountChars(IEnumerable<char> str) =>
str
.GroupBy(x => x)
.ToDictionary(x => x.Key, x => x.Count());
var str1CharCount = CountChars(str1);
var str2CharCount = CountChars(str2);
// Истинно, когда каждый символ из второй строки повторяется меньше или столько-же раз, как и в первой.
return str2CharCount.All(x => x.Value <= str1CharCount[x.Key]);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern SafeProcessHandle OpenProcess(int access, bool inherit, int processId);
using (var processHandler = SafeProcessHandle.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, processId))
{
if (!processHandler.IsInvalid)
{
int needed = 0;
IntPtr[] hMods = new IntPtr[1024];
var strBuilder = new StringBuilder(1024);
var handle2 = new GCHandle();
try
{
if (!GetModuleFileNameEx(processHandler, IntPtr.Zero, strBuilder, (uint)(strBuilder.Capacity)))
return;
fnFileFound(strBuilder.ToString());
handle2 = GCHandle.Alloc(hMods, GCHandleType.Pinned);
var uiSize = (uint)(Marshal.SizeOf(typeof(IntPtr)) * (hMods.Length));
var flag = EnumProcessModulesEx(processHandler, handle2.AddrOfPinnedObject(), uiSize, ref needed, LIST_MODULES_ALL);
if (flag != 0)
{
var uiTotalNumberofModules = needed / (Marshal.SizeOf(typeof(IntPtr)));
for (var i = 0; i < uiTotalNumberofModules; i++)
{
GetModuleFileNameEx(processHandler, hMods[i], strBuilder, (uint)(strBuilder.Capacity));
fnFileFound(strBuilder.ToString());
if (!Active)
break;
}
}
}
finally
{
if (handle2.IsAllocated)
handle2.Free();
}
}
}
string Replace()
{
return Regex.Replace(textBox1.Text, @"(.)(.)", "$1");
}
cancellationToken.IsCancellationRequested
. Если в воркере используется цикл, то проверять можно в каждой итерации.var formWait = new FormWait(cancellationToken =>
{
foreach(var item in _items)
{
if (cancellationToken.IsCancellationRequested)
{
return;
}
item.DoWork();
}
});
wait.Stop = delegate ()
{
var source = _tokenSource;
if (source != null)
{
source.Cancel();
source.Dispose();
_tokenSource = null;
}
};
myThread.Start();
В форме:
public Action<CancellationToken> Worker { get; } // добавляем ссылку на токен останова
public Action Stop { get; set; }
private CancellationTokenSource _tokenSource;
public FormWait(Action<CancellationToken> worker)
{
InitializeComponent();
if (worker == null)
throw new ArgumentNullException();
Worker = worker;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_tokenSource?.Dispose();
_tokenSource = new CancellationTokenSource();
var cancellationToken = = _tokenSource.Token;
Task.Factory.StartNew(() => Worker(cancellationToken ))
.ContinueWith(t => { this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
}
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("Stop");
Stop();
}
public Func<CancellationToken, bool> Worker { get; }
Task.Factory.StartNew<bool>(() => Worker(cancellationToken))
.ContinueWith(t => { if (t.Result) this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
var testFiles = Directory.EnumerateFiles(solutionDirectory + @"\samples");
var sortedTestFiles1 = testFiles.OrderBy(x => x, new NaturalComparer());
// или
var sortedTestFiles2 = testFiles.ToList();
sortedTestFiles2.Sort(new NaturalComparer());
/// <summary>
/// Натуральное сравнение строк
/// </summary>
public class NaturalComparer : IComparer<string>
{
/// <summary>
/// Вызов WinApi-функции для натурального сравнения строк
/// </summary>
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);
/// <summary>
/// Натуральное сравнение строк
/// </summary>
/// <param name="x">Первая строка</param>
/// <param name="y">Вторая строка</param>
/// <returns>Сравнивает две строки, возвращая -1, 0 или 1</returns>
public static int Compare(string x, string y)
{
return StrCmpLogicalW(x, y);
}
/// <summary>
/// Натуральное сравнение строк
/// </summary>
/// <param name="x">Первая строка</param>
/// <param name="y">Вторая строка</param>
/// <returns>Сравнивает две строки, возвращая -1, 0 или 1</returns>
int IComparer<string>.Compare(string x, string y)
{
return StrCmpLogicalW(x, y);
}
}
<div *ngFor="let column of tableColumnsConfig | toIterable | trueOnlyBy : 'value'">
{{column.name}}
</div>
@Pipe({
name: 'toIterable'
})
export class ToIterablePipe implements PipeTransform {
transform(dict: Object) {
return Object.keys(dict || {}).map(key => dict[key]);
}
}
@Pipe({
name: 'trueOnlyBy'
})
export class TrueOnlyByPipe implements PipeTransform {
transform(arr: any[], propName: string): object {
return arr.filter(item => !!item[propName]);
}
}
Не просите людей отвечать вам на личный адрес электронной почтыВот почему вопросы о Node уместнее открыто задавать на Хабрахабре
Хакеры считают, что решение проблемы должно быть общедоступным, прозрачным процессом, в ходе которого первая попытка найти ответ может и должна быть исправлена, есликто-то, более знающий, заметит, что этот ответ неполный или некорректный. Кроме того, отвечающие отчасти вознаграждаются тем, что их компетентность и знания будут замечены коллегами.
Когда вы просите личного ответа, вы мешаете как процессу выработки решения, так и получению вознаграждения. Не делайте этого. Отвечать лично — это выбор отвечающего, и если он так и делает, то обычно потому, что считает вопрос слишком неудачно сформулированным или очевидным для того, чтобы быть интересным другим.
Из этого правила есть одно небольшое исключение. Если вы предполагаете, что на свой вопрос получите множество подобных между собой ответов, не забудьте волшебные слова «отправьте ответ мне, а я резюмирую полученные ответы в статье для дискуссионной группы». Попытка уберечь дискуссионную группу или список рассылки от потока, по сути, идентичных сообщений — это очень любезно, но вы должны сдержать своё обещание и отправить итоговое резюме в дискуссионную группу или список рассылки.