使用类中的一个属性对列表进行随机播放

时间:2013-07-04 21:44:14

标签: c#

我无法根据班级中的一个属性来改组列表。我的SCHEDULE类包含两个属性:sEmployeeIDsStationID

我按如下方式填充列表,但我希望按ID_STATION进行随机播放,并在每次运行时都有不同的内容。

List<SCHEDULE> scheduleList = new List<SCHEDULE>();

foreach (DataRow row2 in tschedule.Rows)
{
    sEmployeeID = row2["ID_EMPLOYEE"].ToString();
    sStationID = row2["ID_STATION"].ToString();
    scheduleList.Add(new SCHEDULE(sEmployeeID, sStationID));
}

实际上我想让我的ID_STATION项目更改行,而我的ID_EMPLOYEE将保持原来的位置。示例:从此,

ID_EMPLOYEE         ID_STATION
ALAD                     DECH
FRED                     DECI
MIKE                     ORR
PAM                      OR
RAK                      ORW
RAYN                     PROC

我想有这个:

ID_EMPLOYEE         ID_STATION
ALAD                     ORW
FRED                     PROC
MIKE                     DECI
PAM                      DECH
RAK                      OR
RAYN                     ORR

1 个答案:

答案 0 :(得分:1)

这有效:

scheduleList = scheduleList.Shuffle().ToList();

好的,仅当您添加使用Fisher-Yates-Durstenfeld shuffle

的扩展程序时,它才有效
public static class EnumerableExtensions
{
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
    {
        return source.Shuffle(new Random());
    }

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (rng == null) throw new ArgumentNullException("rng");

        return source.ShuffleIterator(rng);
    }

    private static IEnumerable<T> ShuffleIterator<T>(
        this IEnumerable<T> source, Random rng)
    {
        List<T> buffer = source.ToList();
        for (int i = 0; i < buffer.Count; i++)
        {
            int j = rng.Next(i, buffer.Count);
            yield return buffer[j];

            buffer[j] = buffer[i];
        }
    }
}

归功于:https://stackoverflow.com/a/1653204/284240