2013-02-15 54 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

相關問題