根据订单随机播放项目

时间:2014-06-19 08:37:55

标签: c# list

我在c#中有一个项目列表,需要根据以下格式对项目进行随机播放。如果可能在Linq Query中做同样的事情?

Input Sample data
    **Frouts**
    Orange
    Orange
    Orange
    Orange
    Mango
    Mango
    Mango
    Mango
    Mango
    Mango
    Apple
    Apple
    Apple

我需要关注Out put

**Frouts**
    Orange
    Mango
    Apple
    Orange
    Mango
    Apple
    Orange
    Mango
    Apple
    Orange
    Mango
    Mango
    Mango

2 个答案:

答案 0 :(得分:3)

此代码将执行您想要的操作,并提供您指定的输出:

var listOfStrings = new List<string>
{
    "Orange",
    "Orange",
    "Orange",
    "Orange",
    "Mango",
    "Mango",
    "Mango",
    "Mango",
    "Mango",
    "Mango",
    "Apple",
    "Apple",
    "Apple"
};

var groupedStrings = listOfStrings.GroupBy(i => i)
    .Select(i => new {i.Key, Items = i.ToList()}).ToList();

var maxGroupSize = groupedStrings.OrderByDescending(i => i.Items.Count).First()
    .Items.Count;

var finalList = new List<string>();

for (var i = 0; i < maxGroupSize; i++)
{
    finalList.AddRange(from wordGroup in groupedStrings 
                        where i < wordGroup.Items.Count 
                        select wordGroup.Items[i]);
}

答案 1 :(得分:0)

您可以在Github中查看我的ShuffleProject。

您可以轻松地将列表移动到T所需的位置和阵列。

如果您想在项目中使用它,您将能够找到代码和.dll。

https://github.com/Oscarbralo/ShuffleProject

但一般来说,你可以使用这样的东西!

public List<T> Shuffle(List<T> objects, int totalElements)
        {
            Random random = new Random();
            List<T> resultList = new List<T>();
            for (int i = 0; i < totalElements; i++)
            {
                int maxElements = objects.Count - 1;
                int randomElement = random.Next(0, maxElements);
                resultList.Add(objects[randomElement]);
                objects.RemoveAt(randomElement);
            }
            return resultList;
        }

我希望这会有所帮助