1

我正在尝试做的是制作一种方法,该方法能够确定某些 int 在我的数字列表中是否不一致(method应该返回缺失的数字)

例如,如果我有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 MyObject我的List它应该得到缺失Order值,在这种情况下3 我可以做:

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

现在我被困住了如何让程序知道有一个丢失的Order数字?

我想我想做什么很清楚(如果不是请问)

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

谢谢大家的帮助

4

3 回答 3

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));
于 2013-02-15T15:52:37.327 回答
1

这是我的建议:

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

intsNotInList包含range其中没有值的list所有Order值。然后,只需循环这些结果以将它们添加到列表中,这非常简单。

foreach (var i in intsNotInList)
{
    var obj = new MyObject() 
    {
        Name = i.ToString(),
        Order = i,
    };
    list.Add(obj);
}
于 2013-02-15T15:46:52.590 回答
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 为空,则没有缺失项。

如果 firstMissing 不为空,则 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();
于 2013-02-15T15:49:07.593 回答