如何检查列表是否连续排序?

时间:2016-08-25 15:37:11

标签: c# list

如果已经没有,我需要重新订购连续列表。任何人都可以建议一种方法来检查它,以便我可以写一个扩展方法来这样调用吗?

var cglist = collectionGroups.OrderBy(x => x.Sequence).ToList();

if (cglist.IsConsecutive)
{
   for (int i = 0; i < cglist.Count(); i++)
   {
      //sorting logic...
    } 
 }

x.Sequence不是实体中的递增属性,并且具有重复和缺失值。这些数据从我无法控制的外部源提供给我的上下文。所以我需要在重新排序方法中使用它并使其相邻

我可以从这个答案找到最接近的解决方案here,这似乎并不是在检查邻接。

3 个答案:

答案 0 :(得分:2)

检查列表是否已排序的唯一方法是遍历列表中的每个项目并将其与下一个项目进行比较,在这种情况下,您也可以首先调用sort,因为它将执行完全同样检查并排序任何乱序

修改: 我怀疑你继续使用“连续”这个词

如果您正在寻找丢失或重复的值,那么您的问题中根本没有提到,但如果是这种情况,简单的左连接将为您执行此操作而无需排序

var min = collectionGroups.Min(x => x.Sequence);
var deviation = collectionGroups.Max(x => x.Sequence) - min;

var result = from i in Enumerable.Range(min, deviation )
             join c in collectionGroups on i equals c.Sequence into grp;
             from g in grp.DefaultIfEmpty()
             where g.Count() != 1
             select new{ ID=g.Key, Count=g.Count()};

然后返回一个重复或缺失值的列表,不需要排序

修改以回复juunas的评论

var data = Enumerable.Range(0, 20000000).ToList();
bool sort = false;
for (int i = 0; i < data.Count - 1; i++)
{
    if (data[i] > data[i + 1])
    {
        sort = true;
        break;
    }
}
if (sort) data.Sort();

884 ms

相比
var data = Enumerable.Range(0, 20000000).ToList();
data.Sort();

651ms

答案 1 :(得分:1)

您可以使用此answer中包含的解决方案。您只需将支票>=0<=0更改为==1==-1

答案 2 :(得分:0)

使用以下循环检查排序

bool isSorted = true;

for(int i = 0;i < cglist.Count; i++)
{
   if( i == cglist.Count - 1)
   {
      break;
   }

   if(cglist[i] > cglist[i + 1])
   {
      isSorted = false;
   }

}