排序和匹配列表项

时间:2015-12-03 20:53:12

标签: c# linq list

我有以下列表,其中每个列表项都有StartEnd值。请注意,每个列表项的End值与下一个列表项的Start值匹配。

tableItems.Add (new SettingsCellItem() {Start=1000, End=4000});
tableItems.Add (new SettingsCellItem() {Start=4000, End=6000});
tableItems.Add (new SettingsCellItem() {Start=6000, End=8000});
tableItems.Add (new SettingsCellItem() {Start=8000, End=11300});
tableItems.Add (new SettingsCellItem() {Start=11300,End=12000});

允许用户仅更新Start值,当用户输入新的Start值时,应在再次显示之前根据Start值对List进行排序。

让我们假设用户将第二个列表项从{Start=4000,End=6000}更新为{Start=140,End=6000}

List<SettingsCellItem> sortedList =tableItems.OrderBy(o=>o.Start).ToList();

我得到了以下输出。当您观察到End值不再与Start值匹配时。

当前输出:

{Start=140,  End=6000}
{Start=1000, End=4000}
{Start=6000, End=8000}
{Start=8000, End=11300}
{Start=11300,End=12000}

我想知道我怎么能得到以下内容:

所需输出

{Start=140,  End=1000}
{Start=1000, End=6000}
{Start=6000, End=8000}
{Start=8000, End=11300}
{Start=11300,End=12000}

2 个答案:

答案 0 :(得分:6)

按开始排序后更新结束?

for(int i = 0; i < sortedList.Count - 1; i++)
{
    sortedList[i].End = sortedList[i+1].Start
}

如果您不想在编辑最后一个元素时丢失结束值,请查看@Kevin Wells的答案

Select的示例:

var normalizedList = sortedList.Select(
                              (e, i) => 
                                 new SettingsCellItem() 
                                 {
                                   Start = e.Start, 
                                   End = i < sortedList.Count - 1 
                                       ? sortedList[i+1].Start : e.End
                                 }).ToList()

答案 1 :(得分:2)

我想到的显而易见的答案是循环遍历新列表并更新结束值以匹配下一个项目的起始值。这样的事可能

public void UpdateEndValues(List<TypeLogSettingsCellItem> list)
 {
    int highestEndValue = list.Max (x => x.End);

    for(int i = 0; i < list.Count -1; i++)
    {
        list[i].End = list[i+1].Start;
    }

    list.Last.End = (list.Last.Start > highestEndValue) ? list.Last.Start : highestEndValue;
}

请注意,我的代码与pikciu之前的答案之间的主要区别在于我保留了最终的End值,如果最后一个CellItem是用户编辑的那个,那么他/她将不会这样做

<强>更新 @texas指出我错误处理新起始值高于旧的最高结束值的情况,所以我更新了我的代码示例以涵盖