Случайный массив с помощью LINQ и C#

@krupesh Anadkat Я, как новичок, разочарован, но @CommonsWare - опытный разработчик, который был в игре уже несколько дней.

Следуйте его советам и убедитесь, что вы изучили основные принципы, которые он обрисовал, а не прорвались или просто торопились что-то построить ради этого.

Тем не менее, сегодня ваш счастливый день, поэтому я побалую вас некоторыми фрагментами кода (нам, тысячелетним программистам, это легко - да, я сказал это !!!), читайте о детях и учитесь.

Проблема, с которой вы здесь сталкиваетесь, заключается в изменении конфигурации устройства .

В вашем случае ориентация экрана изменится.

Каждый раз, когда пользователь поворачивает этот экран, Android OS воссоздает вашу активность по-новому. Android OS означает, что нет ничего плохого в том, что она просто пытается быть эффективной, поскольку она проверяет, есть ли лучшие ресурсы для этой новой ориентации, и если да, то может использовать их вместо этого.

Это источник твоей боли. Теперь давай взломаем и поможем тебе, приятель.

Вы можете использовать методы класса Activity , чтобы выбраться из этого. До того как всемогущая ОС Android убьет вашу активность, в жизненном цикле вашей деятельности будет вызван метод onSaveInstanceState () . В вашем классе вы переопределяете onSaveInstanceState () и сохраняете нужные данные в Bundle , который onSaveInstanceState () принимает в качестве аргумента.

Затем в функции onCreate () вашей активности вы проверяете, не является ли saveInstanceState нулевым, если оно не равно нулю, вы получаете свои данные.

1111 Осторожно, хотя; Лучше всего сохранить примитивные типы данных в Bundle или объекты, которые сериализуемы , чтобы избежать извлечения данных, которые устарели, то есть устарели или больше не действительны. [ 1111]

См. Фрагмент кода для моей активности SaveDataAcrossScreenOrientation ниже

package com.demo.android.savedataacrossscreenrotationdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class SaveDataAcrossScreenOrientation extends AppCompatActivity {

    // Key to be used for the key: value pair to be saved to the bundle
    private static final String KEY_GREETING_TEXT = "greeting_text";

    // The text currently displayed to the screen
    private String mCurrentDisplayedText;

    private TextView mGreetingTextView;
    private Button mSpanishButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Get references to the button and textview
        mGreetingTextView = (TextView) findViewById(R.id.greeting_text_view);
        mSpanishButton = (Button) findViewById(R.id.change_greeting_button);

        // If mCurrentDisplayedText is inside the bundle retrieve and display it on screen
        if(savedInstanceState != null) {
            mCurrentDisplayedText = savedInstanceState.getString(KEY_GREETING_TEXT, "");
            if (mCurrentDisplayedText != "") {
                mGreetingTextView.setText(mCurrentDisplayedText);
            }
        }

        // Set a listener on the spanish button
        mSpanishButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Change the english text to spanish when the button is clicked
                mGreetingTextView.setText(R.string.spanish_greeting);

                // Get the text currently shown in the text view
                mCurrentDisplayedText = (String) mGreetingTextView.getText(); // Calling getText() returns a CharSequence cast it to a string
            }
        });
    }

    // Override onSaveInstanceState(Bundle savedInstanceState) and save mCurrentDisplayedText to the bundle
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putString(KEY_GREETING_TEXT, mCurrentDisplayedText);
    }

}

Смотрите демонстрацию видео здесь

Веселитесь!

11
задан Ryan 31 October 2008 в 20:27
поделиться

6 ответов

VB.Net Fusion Разработчика к преобразователю C# говорит, что эквивалентный код C#:

System.Random rnd = new System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());

Для дальнейшего использования у них также есть C# к преобразователю VB.Net. Существует несколько других инструментов, доступных для этого также.

20
ответ дан 3 December 2019 в 01:54
поделиться

Я первоначально думал, что это будет плохой идеей, так как алгоритм сортировки должен будет сделать несколько сравнений для чисел, и это получит другой ключ сортировки для того же числа каждый раз, когда это называет лямбду для того числа. Однако похоже, что это только называет его однажды для каждого элемента в списке и хранилищ, которые оценивают за более позднее использование. Этот код демонстрирует это:

int timesCalled = 0;
Random rnd = new Random();

List<int> numbers = Enumerable.Range(1, 100).OrderBy(r =>
   {
       timesCalled++;
       return rnd.Next();
   }
).ToList();

Assert.AreEqual(timesCalled, 100);
5
ответ дан 3 December 2019 в 01:54
поделиться
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());
5
ответ дан 3 December 2019 в 01:54
поделиться

Лучше всего я могу сделать первое, что пришло на ум без доступа к Visual Studio (скрещивает пальцы):

System.Random rnd = New System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next);
1
ответ дан 3 December 2019 в 01:54
поделиться

Пользуясь Библиотекой Универсального набора C5, Вы могли просто использовать встроенное Shuffle() метод:

IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();
1
ответ дан 3 December 2019 в 01:54
поделиться

Как насчет чего-то более простого...

Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())
4
ответ дан 3 December 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: