根据顺序洗牌

本文关键字:顺序 | 更新日期: 2023-09-27 18:09:31

我有一个c#项目列表,需要根据下面的格式洗牌项目。如果可能的话,在Linq查询做同样的?

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

我需要以下输出

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

根据顺序洗牌

这段代码将执行您想要的操作,并给出您指定的输出:

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]);
}

您可以在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;
        }

希望对大家有所帮助