Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重新分配列表上的连续序列/增量值(计数编号)_C#_.net_Console Application_Sequence - Fatal编程技术网

C# 如何重新分配列表上的连续序列/增量值(计数编号)

C# 如何重新分配列表上的连续序列/增量值(计数编号),c#,.net,console-application,sequence,C#,.net,Console Application,Sequence,我有以下列表,比如说有连续序列的产品列表: new Product{Name = "iPhone 5S", Sequence = 1, Id = 100}, new Product{Name = "Galaxy S4", Sequence = 2, Id = 201}, new Product{Name = "Xbox One", Sequence = 3, Id = 209}, new Product{Name = "PS4", Sequence = 4, Id = 300} product

我有以下列表,比如说有连续序列的产品列表:

new Product{Name = "iPhone 5S", Sequence = 1, Id = 100},
new Product{Name = "Galaxy S4", Sequence = 2, Id = 201},
new Product{Name = "Xbox One", Sequence = 3, Id = 209},
new Product{Name = "PS4", Sequence = 4, Id = 300}
product.Sequence = Math.Max(1, Math.Min(newSequence, products.Max(p => p.Sequence)));
有一个需要,我想改变序列的任何产品让我们说的“iphone5s”我想改变序列从“1”到“3”。由于序列3已被采用,因此会将序列号重新分配给其他产品,并确保没有产品具有相同的序列值,因此输出将为:

Galaxy S4, Sequence = 1
Xbox One, Sequence = 2
iPhone 5S, Sequence = 3
PS4, Sequence = 4
正如您在所需输出上看到的,序列已重新分配,并将“iPhone 5S”放入所需序列。如果用户输入的序列值大于最高序列值,则此产品将是列表中的最后一个产品,并且还将为其之前的产品重新分配序列。请帮忙。这是我的示例代码。我希望有人能帮助我。目前我的输出非常混乱,大致如下:

混乱输出

      var newSequence = int.Parse(Console.ReadLine());
      if (newSequence <= products.Count&& newSequence>0)
         {
         products.Remove(product);
         products.Insert(newSequence-1,product);
         }
      else
         {
      products.Remove(product);
      products.Insert(newSequence <= 0 ? 0 : products.Count, product);
         }
      var count = 1;
      foreach (var item in products)
         {
         item.Sequence = count;
         count++;
         }

这是我的代码

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var products = new List<Product>
            {
                new Product{Name = "iPhone 5S", Sequence = 1, Id = 100},
                new Product{Name = "Galaxy S4", Sequence = 2, Id = 201},
                new Product{Name = "Xbox One", Sequence = 3, Id = 209},
                new Product{Name = "PS4", Sequence = 4, Id = 300}
            };
            Console.WriteLine("Original List");
            DisplayProduct(products);

            Console.WriteLine("\n\nEnter product id");
            var productId = int.Parse(Console.ReadLine());
            var product = products.FirstOrDefault(x => x.Id == productId);
            if (product == null) Console.WriteLine("Invalid product!");
            else
            {
                Console.WriteLine("Enter new sequence for "+product.Name);
                var newSequence = int.Parse(Console.ReadLine());
                product.Sequence = newSequence;

                var count = 1;
                foreach (var item in products)
                {
                    if (item.Id == product.Id)
                    {
                        count++;
                        continue;
                    }
                    item.Sequence = count;
                    count++;
                }

                Console.WriteLine("\n\nModified product\n");
                DisplayProduct(products);
            }
            Console.ReadLine();
        }

        private static void DisplayProduct(IEnumerable<Product> products)
        {
            products = products.OrderBy(x => x.Sequence);
            foreach (var item in products)
            {
                Console.WriteLine("Sequence=" + item.Sequence + " Name=" + item.Name + " Id=" + item.Id);
            }

        }
    }
    public class Product
    {
        public int Sequence { get; set; }
        public string Name { get; set; }
        public int Id { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
命名空间控制台应用程序2
{
班级计划
{
静态void Main(字符串[]参数)
{
var产品=新列表
{
新产品{Name=“iPhone 5S”,序列=1,Id=100},
新产品{Name=“Galaxy S4”,序列=2,Id=201},
新产品{Name=“Xbox One”,序列号=3,Id=209},
新产品{Name=“PS4”,序列=4,Id=300}
};
Console.WriteLine(“原始列表”);
显示产品;
Console.WriteLine(“\n\n输入产品id”);
var productId=int.Parse(Console.ReadLine());
var product=products.FirstOrDefault(x=>x.Id==productId);
if(product==null)Console.WriteLine(“无效产品!”);
其他的
{
Console.WriteLine(“为“+product.Name”输入新序列);
var newSequence=int.Parse(Console.ReadLine());
product.Sequence=newSequence;
var计数=1;
foreach(产品中的var项目)
{
if(item.Id==product.Id)
{
计数++;
继续;
}
项目。顺序=计数;
计数++;
}
Console.WriteLine(“\n\n修改的产品\n”);
显示产品;
}
Console.ReadLine();
}
私有静态产品(IEnumerable产品)
{
products=products.OrderBy(x=>x.Sequence);
foreach(产品中的var项目)
{
Console.WriteLine(“Sequence=“+item.Sequence+”Name=“+item.Name+”Id=“+item.Id”);
}
}
}
公共类产品
{
公共整数序列{get;set;}
公共字符串名称{get;set;}
公共int Id{get;set;}
}
}

第一个问题是,您在这里无条件地递增
计数

if (item.Id == product.Id)
{
    count++;
    continue;
}
count
小于
newSequence
时,这是不正确的。此更改应解决此问题:

if (count == newSequence)
{
    count++;
}
if (item.Id != product.Id)
{
    item.Sequence = count++;
}
第二个问题是
newSequence
大于当前最大序列或小于1时。要使其工作,您需要将其“封顶”为当前最大顺序:

new Product{Name = "iPhone 5S", Sequence = 1, Id = 100},
new Product{Name = "Galaxy S4", Sequence = 2, Id = 201},
new Product{Name = "Xbox One", Sequence = 3, Id = 209},
new Product{Name = "PS4", Sequence = 4, Id = 300}
product.Sequence = Math.Max(1, Math.Min(newSequence, products.Max(p => p.Sequence)));

我找到了简单有效的解决方案,我希望这能帮助任何需要这样东西的人:

代码片段

      var newSequence = int.Parse(Console.ReadLine());
      if (newSequence <= products.Count&& newSequence>0)
         {
         products.Remove(product);
         products.Insert(newSequence-1,product);
         }
      else
         {
      products.Remove(product);
      products.Insert(newSequence <= 0 ? 0 : products.Count, product);
         }
      var count = 1;
      foreach (var item in products)
         {
         item.Sequence = count;
         count++;
         }
var newSequence=int.Parse(Console.ReadLine());
如果(新序列0)
{
产品。移除(产品);
产品。插入(newSequence-1,产品);
}
其他的
{
产品。移除(产品);

products.Insert(newSequence)我尝试了你的解决方案,但它给了我重复的序列。输出是:Galaxy S4,序列=1;Xbox One,序列=2;iPhone 5S,序列=3;PS4,序列=3