将字符串数组映射到对象列表中的属性C#

将字符串数组映射到对象列表中的属性C#,c#,arrays,linq,list,C#,Arrays,Linq,List,我有一个对象列表List 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、color4...color10} 现在

我有一个对象列表
List 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、color4...color10}

现在,我的清单上有大约35项。可以有多个具有相同SourceTitle和Id的项目。我想为具有相同SourceTitle的项目指定颜色。最终,当我的标题计数超过10时,第11个标题应再次分配颜色1

现在,我使用如下Id进行操作:

myList.ForEach{x => x.Color = colorPallete.ElementAtOrDefault((x.Id -1) % colorPallete.Length));
这很好,但如果两个不同Id的其余部分相同,它们将被指定相同的颜色,这不是我想要的

有没有一种方法可以根据标题而不是ID分配颜色?

foreach(list.GroupBy(x=>x.SourceTitle)中的var组)
foreach (var group in list.GroupBy(x => x.SourceTitle))
{
    for (int i = 0; i < group.Count(); i++)
    {
        group.ElementAt(i).Color = palette[i % 10];                        
    }
}
{ 对于(int i=0;i
以下是您想要的:

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]];
}
这就是您需要的:

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];
    }
}

谢谢你的回答。但这对所有标题都适用相同的颜色没有问题。这是你想要的吗?SourceTitle具有唯一的颜色,除非颜色超过10?int计数器=0;foreach(list.GroupBy(x=>x.SourceTitle)中的var-group){for(int i=0;iID是否可以重复,或者仅
SourceTitle
?@helloworld我只是稍微修改了一下,以提高性能。请再检查一下。请您说明一下我的答案有什么问题?否则你的投票是没有意义的,因为我不知道如何改进它。
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];
    }
}