将字符串数组映射到对象列表 C# 中的属性
本文关键字:属性 列表 对象 字符串 数组 映射 | 更新日期: 2023-09-27 18:37:05
我有对象列表List<MyModel> myList
我的模型.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 个项目。可以有多个具有相同源标题和 ID 的项目。我想为具有相同源标题的项目分配颜色。最终,当我的标题计数超过 10 时,第 11 个标题应再次分配 Color1。
现在,我使用 Id 执行此操作,如下所示:
myList.ForEach{x => x.Color = colorPallete.ElementAtOrDefault((x.Id -1) % colorPallete.Length));
这工作正常,但如果两个不同 Id 的其余部分相同,它们将被分配相同的颜色,这不是我想要的。
有没有办法分配与标题而不是 ID 相关的颜色?
这是你想要的:
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]];
}
输出:
ID Source Color
--------------------------
0 5 color1
1 19 color2
2 8 color3
3 15 color4
4 12 color5
5 15 color4
6 3 color6
7 16 color7
8 3 color6
9 17 color8
10 18 color9
11 8 color3
12 4 color10
13 13 color1
14 4 color10
15 18 color9
16 4 color10
17 3 color6
18 14 color2
19 1 color3
20 3 color6
21 4 color10
22 6 color4
23 17 color8
24 13 color1
25 17 color8
26 8 color3
27 6 color4
28 18 color9
29 13 color1
30 2 color5
31 11 color6
32 18 color9
33 19 color2
34 19 color2
35 10 color7
36 13 color1
37 5 color1
38 11 color6
39 2 color5
40 2 color5
41 10 color7
42 12 color5
43 2 color5
44 13 color1
45 12 color5
46 2 color5
47 18 color9
48 14 color2
49 6 color4
50 8 color3
51 11 color6
52 14 color2
53 3 color6
54 7 color8
55 1 color3
56 14 color2
57 10 color7
58 3 color6
59 15 color4
60 7 color8
61 16 color7
62 17 color8
63 10 color7
64 15 color4
65 7 color8
66 10 color7
67 4 color10
68 14 color2
69 13 color1
70 5 color1
71 18 color9
72 12 color5
73 12 color5
74 19 color2
75 12 color5
76 12 color5
77 4 color10
78 5 color1
79 1 color3
80 16 color7
81 10 color7
82 12 color5
83 13 color1
84 5 color1
85 11 color6
86 17 color8
87 16 color7
88 13 color1
89 19 color2
90 15 color4
91 3 color6
92 3 color6
93 15 color4
94 15 color4
95 5 color1
96 13 color1
97 3 color6
98 7 color8
99 6 color4
foreach (var group in list.GroupBy(x => x.SourceTitle))
{
for (int i = 0; i < group.Count(); i++)
{
group.ElementAt(i).Color = palette[i % 10];
}
}
这是你需要的:
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];
}
}