И еще вопрос: как реализовано то, что в приложении блога человек может добавлять новости и они отображаются у всех скачавших?в том то и дело что без бекэнда ни как. обычно это функционал блога на веб сайте. не совсем понятно почему вы хотите именно приложение. но если на то пошло, переформулируйте цель - уберите слово блог, замените его на клиент-серверное приложение. тогда сразу станет проще подбирать необходимые технологии. можно рассмотреть примеры реалтайм чатов, их в сети не так уж и мало. в частности на основе SignalR
MessageId
выше, то описания не видно, проблема может быть там. попробуйте не объявляйте переменную заранее, а получить ее прямо во время вызова. вот такSetChatPhoto(out var MessageId, File)
как описать две функции, которые принимают и возвращают подобные tuple?там точно решена
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace experience_with_tuples
{
class Program
{
static void Main(string[] args)
{
var t = (1, "test", true);
ConOut_tuple(job_with_tuple(t));
// хотя можно и так. но не забываем про скобки
ConOut_tuple(job_with_tuple((1, "test", true)));
}
static (int, string, bool) job_with_tuple((int, string, bool) t)
{
(var i, var s, var b) = t;
i++;
s += " successful";
b = !b;
return (i, s, b);
}
static void ConOut_tuple((int, string, bool) t) =>
Console.WriteLine(
t.Item1 + Environment.NewLine +
t.Item2 + Environment.NewLine +
$"detected errors: {t.Item3}"
);
}
}
public (int, int) MovePoint(int x, int y)
{
// bla-bla-bla
// изменения x, y
return (x, y);
}
...
(var newX, var newY) = MovePoint(oldX, oldY);
.csproj
. править можно в любом редакторе, при выгруженной студии. но делать бекапы весьма полезноlabel2
label2
WinForms
public
на метод, который пытается изменить label2
, но возможно умудрились label2
сделать недоступным. по дефолту визуального конструктора, он скоре всего так public
, но может это вторичная фрма? которую вы всю всю сделали private
?... (хотя тут и компилятор бы ругнулся..) тем не менее - без полной картины качественный ответ невозможнint score=0;
label2.Text = "хоть что то";
while (score <= 0)
{
score = textBox1.TextLength;
richTextBox1.Text += score;
if(score>0)
label2.Text = score.ToString();
}
score
имеет отрицательное значение. но...int score=0;
, мало того, изначальное инициализиреуем label2
не пустым значением, а это будет только подливать керосина в костер, но уже в теле циклаscore = textBox1.TextLength;
вот только это значение ни когда не может быть отрицательным (а судя по остальному коду цикла, даже вряд ли нулевым хоть когда либо)while (score <= 0)
(то есть равенство нулю допустимо волею автора изначально) прервать эту вакханалию может только отрицтельное значение.. ну или break;
по какому то осмысленному условию, которое реально может наступить в достаточно короткие сроки.. а не через годы, а то ведь бешатой собаке семь верст не круг (с)C# лучший универсальный язык современности(с) Дмитрий Нестерук, сказано не особо давно. на тот момент точно уже съел собаку и в шарпе, и в плюсах (C++), и в F# (у меня есть основания так считать). много лет проработал в JetBrains, как раз главным по .net. что не поделили не знаю, да и не благодарное это занятие чужое исподнее разглядывать
IEnumerable<T>
нужен тогда и только тогда, когда нужны асинхроннные или ленивые вычисления, по тому что метод возвращающий IEnumerable<T>
, имеет право возвращать не весь набор, а возвращать экземпляры T
поштучно, вот такyield return
(T)foo;почему то значения в r1 r2 другие, хоть и приближенные
Random.Range(numbers[0], numbers[2]);
numbers[0]
, ни numbers[2]
. вы же задаете их как границы диапазона будущего случайного значения. обычно вы получите действительно значение где то между границnumbers.Remove(r1);
скорее всего ни чего не удаляет из списка. для удаления надо укзать значение, которое там действительно существуета r3 всегда равен min
numbers = new List<float>() { min, mid, max };
...
r3 = numbers[0];
numbers = new List<float>() { min, mid, max };
// тут без изменений
// далее различаем индексы и сами значения
i1 = Random.Range(0, numbers.Count-1);
r1 = numbers[i1]
numbers.RemoveAt(i1);
// ну или как вариант
i_n = Random.Range(0, numbers.Count-1);
r_n = numbers[i_n]
numbers.Remove(r_n);
// как видите, ни одной строки не убавилось. а удаление по индексу точно быстрее
// полную совместимость с Unity это уж сами проверьте
// естественно n ни когда не должно превышать исходного размера списка
// и еще - средства раскраски синтаксиса напомнили in это зарезервированное
// ключевое слово ;))
Random.Range()
возвращает float
, а в качестве индекса должно использоваться int
. в традиционном дотнете, приведение местами пойдет автоматически, но где то придется использовать явные приемы приведения типов...i_n = Random.Range(0, numbers.Count);
numbers.Count
всегда вернет актуальное значение размера. его нельзя использовать в качесве индекса. но нас только что заверили, что рандомайзер не возвращает верхнюю грницу. значит такой код и короче и корректнее Ссылки от того куда положили возвращаем в виде коллекции тому кто нас вызвал.вот это место не очень вписывается в концепцию конвеера на IEnumerable/yield/async/await
Пробовал с BlockingCollectionповторюсь, на сколько я уловил вашу задачу, кроме IEnumerable<>, в подобном конвеере в принципе ни че больше не нужно. ну или разве что как вы там результат решите формировать. но и для результата, даже для накопителя, из дотнетовских конструкций, того же IEnumerable<> за уши, а из него, если кончно это требуется, можно и json формировать