0

クラスの 1 つのプロパティに基づいてリストをシャッフルするのに問題があります。私SCHEDULEのクラスには 2 つのプロパティが含まれています: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_EMPLOYEE が元の位置に留まっている間に、ID_STATION アイテムの行を変更したいと考えています。例:これから、

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
4

1 に答える 1

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

于 2013-07-04T22:01:54.480 に答える