fellanmorgh Ответов: 1

Выберите случайный элемент из объекта списка


Привет,

Я играю со списками, и мне было интересно, как показать случайный элемент/элемент из этого списка.

У меня есть класс под названием персона

public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
    }


В моей форме я создал два текстовых поля (txtName & txtSurname) чего я хочу добиться, так это того, что всякий раз, когда пользователь нажимает кнопку (btnShow), он автоматически отображает либо имя, либо фамилию (никогда не оба).

Я создал список, содержащий объект Person и инициализированный объект Person.
private List<Person> people = new List();
private Person person;


Это мое событие btnCreate. Что добавляет новых людей в список:

private void btnShow_Click(object sender, EventArgs e){
person= new Person();
person.Name= txtName.Text;
country.Surname= txtSurname.Text;
countries.Add(country);
}


Что я уже пробовал:

Это мое событие btnShow который будет показывать список<&ГТ; предметы в текстовых полях. Имейте в виду, что я хочу также отображать только имя или фамилию каждый раз, а не оба. И я не знаю, как это сделать. Я пытался просто перетасовать весь список, чтобы получить что-то отображаемое, но оно отображалось, например, System.Случайное вместо настоящего имени.

private void btnShow_Click(object sender, EventArgs e){
Random r = new Random();
string random = people[r.Next(people.Count)].ToString();

txtName.Text = random.ToString();
}


Любая помощь будет оценена по достоинству

Спасибо.

OriginalGriff

Помочь в чем именно?
Что код делает такого, чего вы не ожидали, или не делает того, что вы сделали?
Где ты застрял?
Какая помощь вам нужна?

1 Ответов

Рейтинг:
8

F-ES Sitecore

"Не работает" не дает никому достаточно информации, чтобы помочь вам, что происходит, что вы не ожидали, или что не происходит, что вы хотите, чтобы произошло?

Я предполагаю, что ваша проблема частично заключается в использовании ToString для объекта Person. Если вы не переопределите ToString, то просто получите имя типа. Так что либо будьте откровенны в том, как вы хотите, чтобы результат выглядел;

string random = people[r.Next(people.Count)];
string result = random.Surname + ", " + random.Name;


или переопределите ToString в классе Person, чтобы вернуть нужный результат. Если результат должен быть случайным имя или фамилия вы можете сделать что то вроде

public string ToString(Random random)
{
    if (random.Next(2) == 0)
    {
        return this.Name;
    }
    else
    {
        return this.Surname;
    }
}

public override string ToString()
{
    return ToString(new Random());
}


Я сделал стандартную ToString (), а также ту, где вы можете передать свой собственный экземпляр Random. Это делается на случай, если вы хотите запустить код в цикле. Random использует время в качестве семени для своего генератора случайных чисел, поэтому, если вы создадите новые экземпляры Random в цикле, вы можете каждый раз получать одно и то же случайное число, потому что не прошло достаточно времени для генерации нового семени\последовательности.


fellanmorgh

Обновил вопрос, извините за это. Да, он показывал систему.Случайное вместо настоящего имени или фамилии. Я попробовал первое решение, которое вы предложили, но всякий раз, когда я пытаюсь ввести случайное.Фамилия + ", " + случайная.Имя, но оно говорит об этом .Имя или фамилия досента существуют.

F-ES Sitecore

Код, который я опубликовал, был неправильным :o

Случайный человек = человек[Р.Рядом(людей.Рассчитывать)];
результат строки = случайный.Фамилия + ", " + random.Name;

Обратите внимание, что я удалил " ToString()" из строки "random =".

fellanmorgh

Ладно, круто, что сработало просто отлично :). Еще один вопрос о методах из решения номер два. Я не уверен, где я должен называть его всякий раз, когда я хочу отобразить только имя или фамилию. Должен ли я называть его так: string result = randon.ToString(r)?

F-ES Sitecore

Да, вы бы назвали это так

Случайный человек = человек[Р.Рядом(людей.Рассчитывать)];
результат строки = случайный.Метод toString();

или если у вас есть код в цикле сделайте это;

Случайный человек = человек[Р.Рядом(людей.Рассчитывать)];
результат строки = случайный.ToString(r);

fellanmorgh

Потрясающий. Поиграл с ним, отлично работает :). Большое спасибо за помощь.