[英]assigning random values from List<A> into List<B> C#
我正在編寫將列表A中的隨機數分配給列表B中的一組對象的代碼。
要求如下:
我有一個“活動列表”和“活動收件人列表”,我需要介紹以下三種情況:
我遇到的問題是第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;
}
}
}
您讓它變得太復雜了。 你可以這樣做:
這樣,您只需要將列表重新排列一次即可。 而且您不必跟蹤哪些用戶已經擁有廣告系列。
例:
隨機播放用戶:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.