Ich musste etwas in MVC für eine gewichtete Anzeigensteuerung schreiben, die nicht die gleiche Anzeige zweimal hintereinander zeigte, und in meiner Eile endete ich mit einem schrecklichen Code, der als Inspiration für Sie dienen könnte .
Ich bin sicher, es gibt viele bessere Möglichkeiten, dies zu tun (und ich kenne bereits Fälle, in denen das Duplikate durchlässt, wenn es nicht sollte), aber für die kurze Zeit, die ich darauf verbrachte, hat es den Job gemacht.
public List<Ad> GetRandomWeightedAds()
{
/* Generate random order list of ads with duplicates for ViewsPerRotation */
List<Ad> returnList = GetAllAds().SelectMany(s => Enumerable.Repeat(s, s.ViewsPerRotation)).OrderBy(s => Guid.NewGuid()).ToList();
for (int i = 0; i < returnList.Count - 1; i++) /* Compare all but the last element against subsequent element */
{
if (returnList[i].Id == returnList[i + 1].Id)
{
/* If next to an identical element try and find a new spot for the subsequent element */
for (int j = 0; j < returnList.Count; j++)
{
if (returnList[j].Id != returnList[i].Id /* Don't switch identical element back into same pos*/
&& (j<i || j == 0 || j-1 == i || returnList[i].Id != returnList[j - 1].Id) /* When moving before current 'i', don't move into a place after an identical element */
&& (j<i || j == returnList.Count - 1 || j + 1 == i || returnList[i].Id != returnList[j + 1].Id)) /* When moving before current 'i', don't move into a place before an identical element */
{
returnList[i] = returnList[j];
returnList[j] = returnList[i+1]; /* returnList[i+1] == returnList[i] */
break;
}
}
}
}
return returnList;
}
ich nichts falsch mit der Frage sehen. –
@ [KingNestor]: Die Umformulierung ist ausgezeichnet, danke. jetzt ist es eine allgemeine Frage. Ihre Burg ist jetzt aus Stein statt aus Sand. –
Nichts ist verkehrt mit Sandburgen, außer den Punk-Kids, die herumlaufen und sie niedermachen, um den Tag anderer zu ruinieren. – ceejayoz