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

时间:2016-03-03 05:30:43

标签: c# arrays linq list

我有对象列表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?

3 个答案:

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