const Input = () => {
const range = { min: 5, max: 50 }
const [value, setValue] = useState<number | "">(range.min)
function onBlurHandle(value: number) {
if (value >= range.min && value < range.max) return;
setValue(range.min)
}
return (
<input
type="number"
value={value}
onChange={({ target }) => setValue(target.value === "" ? "" : +target.value)}
onBlur={({ target }) => onBlurHandle(+target.value)}
min={range.min}
max={range.max}
/>
)
}
(int, char, char) FindFirstDifference(string a, string b)
{
var length = Math.Min(a.Length, b.Length);
for (int i = 0; i < length; i++)
{
if (a[i] != b[i])
return (i, a[i], b[i]);
}
if (a.Length == b.Length)
return (-1, '\0', '\0');
return (length, a.Length == length ? '\0' : a[length], b.Length == length ? '\0' : b[length]);
}
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
var request = new // По хорошему надо вынести в отдельный класс или record
{
sinceDateTimeUtc = new DateTime(2020, 01, 01, 0, 0, 0),
tillDateTimeUtc = new DateTime(2022, 12, 11, 0, 0, 0),
};
var httpRequest = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://test/test/test/sync?test&operation=test"),
Headers = {
Authorization = AuthenticationHeaderValue.Parse("1sav23456vdsa7vsa8"),
Accept = {MediaTypeWithQualityHeaderValue.Parse("application/json")}
},
Content = new StringContent(JsonSerializer.Serialize(request))
{
Headers = {
ContentType = MediaTypeHeaderValue.Parse("application/json"),
},
},
};
// По возможности httpClient нужно переиспользовать. Инициализируй 1 раз, сделай побольше запросов, а в конце Dispose()
using var httpClient = new HttpClient();
var response = await httpClient.SendAsync(httpRequest);
// Дальше работаем с response так, как нам нужно
var contentString = await response.Content.ReadAsStringAsync();
Console.WriteLine(contentString);
var (a, b) = Console.ReadLine().Split(" ").Select(int.Parse);
public static class DeconstructEnumerable
{
public static void Deconstruct<T>(this System.Collections.Generic.IEnumerable<T> enumerable, out T item1, out T item2)
{
using var enumerator = enumerable.GetEnumerator();
if (!enumerator.MoveNext())
throw new ArgumentException("not enough values to unpack (expected 2, got 0)", nameof(enumerable));
item1 = enumerator.Current;
if (!enumerator.MoveNext())
throw new ArgumentException("not enough values to unpack (expected 2, got 1)", nameof(enumerable));
item2 = enumerator.Current;
if (enumerator.MoveNext())
throw new ArgumentException("too many values to unpack (expected 2)", nameof(enumerable));
}
}
chat
id - идентификатор чата
name - название чата (тема обсуждения)
user_id - идентификатор пользователя, который создал чат (необязательно)
roster
chat_id - идентификатор чата
user_id - идентификатор пользователя
group_id - ид группы, если пользователь пишет от имени группы или NULL, если от пользователя (можно даже держать 2 записи, где group_id = null и где нет)
messages
id - идентификатор сообщения
chat_id - идентификатор чата
user_id - ид пользователя
group_id - ид группы, если сообщение отправлено от имени группы или NULL, если от пользователя
text - текст сообщения
message_status
message_id - идентификатор сообщения
user_id - идентификатор пользователя
read - прочтено или нет
notified - отправлено уведомление о сообщении или нет