簡體   English   中英

將列表中的隨機值分配給<A>列表<B>C#</a>

[英]assigning random values from List<A> into List<B> C#

我正在編寫將列表A中的隨機數分配給列表B中的一組對象的代碼。

要求如下:

我有一個“活動列表”和“活動收件人列表”,我需要介紹以下三種情況:

  1. 當我在兩個列表,2個廣告系列和2個收件人上的數量相等時,“我一點都沒問題,它會隨機選擇一個campaignID,並將其分配給列表B中隨機選擇的收件人,依此類推。
  2. 當我有3個廣告系列和1000個收件人時,它將把“收件人列表”分為三組,並為每個組分配一個隨機選擇的廣告系列ID。
  3. 當有5個廣告系列和3個收件人時,它將隨機選擇3個廣告系列並將它們分配給收件人。

我遇到的問題是第2點。這需要很長時間,以至於操作開始超時。 它根據我的需要分配數字,但是在處理1k或更多收件人時非常慢。

private static void RandomizeScenarios(ref IList<CampaignLib> cmp, ref IList<CampaignRecipientLib> rec)
{
    IEnumerable<int> RecipientsIds = rec.Select(x => x.ID).ToList();
    IList<int> CampaignsIds = cmp.Select(x => x.CampaignId.Value).ToList();
    int initVal = RecipientsIds.Count() / CampaignsIds.Count;
    int i = 0;

    if (CampaignsIds.Count < rec.Count())
    {
        List<CampaignRecipientLib> tmpRecipients = new List<CampaignRecipientLib>();

        foreach (var item in CampaignsIds)
        {
            i++;
            IEnumerable<int> tmp = null;

            if (i < CampaignsIds.Count) tmp = RecipientsIds.Shuffle().Take(initVal);
            else tmp = RecipientsIds.Shuffle().Take(RecipientsIds.Count());


            RecipientsIds = from r in RecipientsIds where !tmp.Contains(r) select r;

            var PartialRecipients = from r in rec where tmp.Contains(r.ID) select r;


            // HERE IT TAKES A VERY LONG TIME < 35mins for 2.5K objects
            PartialRecipients.ToList().ForEach(r => r.CampaignId = item);

            tmpRecipients.AddRange(PartialRecipients);

        }
        rec = tmpRecipients;
    }
    else if (CampaignsIds.Count == rec.Count())
    {
        foreach (var item in CampaignsIds)
        {
            int tmp = RecipientsIds.Shuffle().Take(1).FirstOrDefault();

            RecipientsIds = from r in RecipientsIds where tmp != r select r;

            rec.FirstOrDefault(x => x.ID == tmp).CampaignId = item;                  
        }
    }
    else if (CampaignsIds.Count > rec.Count())
    {
        foreach (var item in CampaignsIds.PickRandom(RecipientsIds.Count()).OrderBy(x => x))
        {
            int tmp = RecipientsIds.Shuffle().PickRandom(1).FirstOrDefault();

            RecipientsIds = from r in RecipientsIds where tmp != r select r;

            rec.FirstOrDefault(x => x.ID.Equals(tmp)).CampaignId = item;
        }
    }

}

您讓它變得太復雜了。 你可以這樣做:

  • 隨機排列收件人列表。
  • 首批(nr收件人/廣告系列數量)收件人獲得第一個廣告系列
  • 下一批收件人獲得第二個廣告系列
  • 諸如此類

這樣,您只需要將列表重新排列一次即可。 而且您不必跟蹤哪些用戶已經擁有廣告系列。


例:

  • 用戶:1 2 3 4 5 6
  • 廣告活動:1 2

隨機播放用戶:

  • 用戶:(5 3 2 4 1 6)
  • 用戶(5 3 2)獲得廣告系列1
  • 用戶(4 1 6)獲得廣告系列2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM