Как вернуть строку ресурса в случайном порядке? - PullRequest
1 голос
/ 12 октября 2010
ResourceSet rs = Resources.Loading.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true);

пока у меня есть эта строка, которая получает все сообщения о загрузке,

моя проблема в том, что ResourceSet является IEnumerable.Я не могу понять, каким будет лучший способ вернуть случайную строку в этом перечислимом.

В идеале я бы сделал что-то вроде rs[Utility.Random(rs.Length)]

, но я не могу понятькак привести ResourceSet в список (например), чтобы мне не пришлось прибегать к мерзости, например, к ручному циклу с чем-то ужасным, например:

    public static string RandomLoadingMessage()
    {
        ResourceSet rs = Resources.Loading.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true);

        int count = 0;

        foreach(object res in rs)
            count++;

        int position = Utility.Random(count);

        count = 0;

        foreach(DictionaryEntry res in rs)
        {
            if(count++ == position)
                return res.Value.ToString();
        }

        return string.Empty;
    }

1 Ответ

1 голос
/ 12 октября 2010

Поскольку вы упомянули, что у вас есть доступ к LINQ, вы можете использовать метод расширения Enumerable.Cast<TResult>() для преобразования IEnumerable в его общую версию (IEnumerable<DictionaryEntry>):

static Random rng = new Random(); // outside of method...

// ...

ResourceSet rs = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true);
var resources = rs.Cast<DictionaryEntry>();
string randomValue = resources.ElementAt(rng.Next(0, resources.Count())).Value.ToString();
...