2013-02-15 57 views
1

我想要做的是创建一个方法,它能够计算出某些int在我的数字列表中是否不一致(method应返回缺少的数字)用于检查对象列表中的数字consist的方法

例如,如果我有List<MyObject>这样的:

class MyObject 
{ 
    public string Name{ get; set;} 
    public int Order{ get; set;} 
    public MyObject(string name, int order) 
    { 
     Name = name; 
     Order = order; 
    } 
} 
List<MyObject> list = new List<MyObject>{new MyObject("1",1),new MyObject("2",2),new MyObject("4",4)};//and so on here can be even 100+ object 
//or 
list = new List<MyObject>{new MyObject("2",2), new MyObject("1",1), new MyObject("4",4)}; 

现在我想Add一些new MyObjectList它应该得到失踪Order值在这种情况下3 我可以做:

list = list.OrderBy(x=>x.Order);//this will sort my array 

现在我卡住了如何让程序知道有一个缺少的Order数字?

我认为这是清楚我想要做的(如果不是请询问)

编辑: 订单号不是唯一的。

谢谢大家的帮助

回答

2

Enumerable.Except在这种情况下非常有用:

int min = list.Min(o => o.Order); 
int max = list.Max(o => o.Order); 
var allNum = Enumerable.Range(min, max - min + 1); 
IEnumerable<int> missingOrderNumbers = allNum.Except(list.Select(o => o.Order)); 
+0

为什么你要做'Enumarable.Range(min,max-min + 1);'?范围总是从1开始。而'Range'用'max'值或不带?返回'array'? – harry180 2013-02-15 16:02:33

+1

@ harry180:因为您想查找最小和最大订单号码之间的所有缺失订单,是吗?如果不是这种情况,你可以使用'Enumerable.Range(1,max)'。不,它不返回一个数组,它类似于循环变量从'1'开始并在'max'结束的'for-loop'。所以不必创建额外的集合。 – 2013-02-15 16:05:20

+0

确定:)我将使用'Range'开始'1'。感谢您的帮助:) – harry180 2013-02-15 16:11:13

1

这里是我建议:

var max = 100; 
var range = Enumerable.Range(1, max); 
var intsNotInList = range.Except(list.Select(x => x.Order)); 

intsNotInList包含range所有值,其中有不listOrder的值。然后,只需循环这些结果就可以将它们添加到列表中。

foreach (var i in intsNotInList) 
{ 
    var obj = new MyObject() 
    { 
     Name = i.ToString(), 
     Order = i, 
    }; 
    list.Add(obj); 
} 
1

如果你只想要第一个缺少一个则:

var firstMissing = list.OrderBy(x => x.Order) 
        .Select((x, i) => new {Index = i + 1, Item = x}) 
        .FirstOrDefault(x => x.Index != x.Item.Order); 

如果firstMissing为null,则没有丢失物品。

如果firstMissing不为null,则FirstMissing.Index将是您需要插入的第一个缺失项目的订单号。注意我假定你是从1开始的第一个项目,而不是0

或者这将返回一个int这是第一个缺失索引:

var firstMissingIndex = list.OrderBy(x => x.Order) 
        .Where((x, i) => i + 1 != x.Order) 
        .Select(x => x.Order - 1) 
        .FirstOrDefault(); 
+0

无需订购整个集合以查找缺少的订单。 – 2013-02-15 16:07:26

相关问题