我有对象列表List<MyModel> myList
MyModel.cs
public int Id {get; set;}
public int SourceTitle {get; set;}
public int Detail {get; set;}
public string Color {get; set:}
我有一个字符串数组,即。
string[] colorPallete[] = {color1, color2, color3, coloe4 ..... color10}
现在,我的列表中有大约35个项目。可以有多个具有相同SourceTitle和Id的项目。我想为具有相同SourceTitle的项目指定颜色。最终,当我的标题数量超过10时,第11个标题应再次与Color1一起分配。
现在,我使用Id执行以下操作:
myList.ForEach{x => x.Color = colorPallete.ElementAtOrDefault((x.Id -1) % colorPallete.Length));
这样可以正常工作,但如果两个不同的Id的剩余部分相同,则会为它们分配相同的颜色,这不是我想要的颜色。
有没有办法可以分配与标题相关的颜色而不是ID?
答案 0 :(得分:0)
foreach (var group in list.GroupBy(x => x.SourceTitle))
{
for (int i = 0; i < group.Count(); i++)
{
group.ElementAt(i).Color = palette[i % 10];
}
}
答案 1 :(得分:0)
这是你想要的:
O(n * log(n))
输出:
SortedList<int, int> colorHistory = new SortedList<int, int>();
int k = -1;
for (int i = 0; i < myList.Count; i++)
{
if (!colorHistory.ContainsKey(myList[i].SourceTitle))
{
colorHistory[myList[i].SourceTitle] = ++k % colorPallete.Length;
}
myList[i].Color = colorPallete[colorHistory[myList[i].SourceTitle]];
}
答案 2 :(得分:0)
这就是你需要的:
foreach (var x in myList.GroupBy(m => m.SourceTitle).Select((gms, i) => new { gms, i }))
{
foreach (var m in x.gms)
{
m.Color = colorPallete[x.i % colorPallete.Length];
}
}