【问题标题】:How can I remove every nth item from a list in C#?如何从 C# 中的列表中删除每个第 n 项?
【发布时间】:2022-06-24 19:08:31
【问题描述】:

我想将MASH game 重新创建为控制台应用程序。

我目前有代码来接收用户输入并将数据放入单独的列表中。

在我的游戏版本中,程序会使用你的名字并计算其中有多少个字符 (numberOfLetters)。这是在上面的链接中绘制螺旋的替代方法。然后它会使用这个值来删除每个第 n 个值,直到每个列表中的每个项目都只有一个。

我正在努力编写最后一部分的逻辑。我认为创建一个累积列表然后删除第 n 个术语是有意义的,但我不确定如何告诉程序如何在每个列表中保留一项。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Welcome to the MASH game!");

        Console.WriteLine("Enter three colleges or universities...");
        List<string> CollegeList = new List<string>();
        for (int i = 0; i < 3; i++)
        {
            CollegeList.Add(Console.ReadLine());
        }

        Console.WriteLine("Enter three babes or dudes that you might marry...");
        List<string> BabeList = new List<string>();
        for (int i = 0; i < 3; i++)
        {
            BabeList.Add(Console.ReadLine());
        }

        Console.WriteLine("Enter three (3) cities which you might live in...");
        List<string> CityList = new List<string>();
        for (int i = 0; i < 3; i++)
        {
            CityList.Add(Console.ReadLine());
        }

        Console.WriteLine("Enter three numbers...");
        List<string> NumberList = new List<string>();
        for (int i = 0; i < 3; i++)
        {
            NumberList.Add(Console.ReadLine());
        }

        Console.WriteLine("Enter three majors...");
        List<string> MajorList = new List<string>();
        for (int i = 0; i < 3; i++)
        {
            MajorList.Add(Console.ReadLine());
        }

        Console.WriteLine("Enter three occupations...");
        List<string> JobList = new List<string>();
        for (int i = 0; i < 3; i++)
        {
            JobList.Add(Console.ReadLine());
        }

        List<string> ShelterList = new List<string>();
        ShelterList.Add("Mansion");
        ShelterList.Add("Apartment");
        ShelterList.Add("Shack");
        ShelterList.Add("House");

        Console.WriteLine("Alright smartass, enter your name");
        string Name = Console.ReadLine();
        int numberOfLetters = Name.ToCharArray().Count();
        Console.WriteLine("........." + numberOfLetters + ".........");

    }
}}

【问题讨论】:

  • 您发布的代码似乎与您的问题无关。您尝试过什么,遇到过什么问题?另外,请明确“删除每第n个值直到只有一个”的确切技术要求。
  • “然后它会使用这个值来删除每个第 n 个值”——它将如何使用这个值?如果列表小于这个值怎么办?

标签: c# list


【解决方案1】:

好吧,让我们陈述问题然后解决它。有一个清单,说

{0, 1, 2, 3, 4, 5, 6, 7, 8}

我们想从某个索引中删除every item startAt,例如

{0, 1, 2, 3, 4, 5, 6, 7, 8} => {0, 1, 2, 3, 5, 7}
          ^  *     *     *      
          |  remove every 2nd item
          |  
          start at 4th item     
   

代码:

// return true if at least one item has been removed
public static bool Remover<T>(List<T> list, int every, int startAt = 0) {
  if (list == null)
    throw new ArgumentNullException(nameof(list));
  if (every <= 0)
    throw new ArgumentOutOfRangeException(nameof(every));

  if (startAt >= list.Count)
    return false;

  int shift = 0;

  for (int i = Math.Max(0, startAt); i < list.Count; ++i) 
    if ((i - startAt) % every == 0)
      shift += 1;
    else
      list[i - shift] = list[i];
  
  list.RemoveRange(list.Count - shift, shift);

  return shift > 0;
}

【讨论】:

    【解决方案2】:

    我正在努力编写最后一部分的逻辑。我认为创建一个累积列表然后删除第 n 个术语是有意义的,但我不确定如何告诉程序如何在每个列表中保留一项。

    这在很大程度上取决于您的整数numberOfLetters。诸如 this 是否大于迭代前后列表的大小等因素。

    Console.WriteLine("Alright smartass, enter your name");
    string Name = Console.ReadLine();
    int numberOfLetters = Name.Length;
    int len = list.Count;
    for(int i=0; i<len; i++) {
       if(numberOfLetters < len && i % numberOfLetters == 0 && len > 1) {
       list.RemoveAt(i);
      }
    }
    

    上述逻辑不能保证列表会减少到 1 项。如果您需要将其减少到最后一项,那么您将需要像这样使用random(),尤其是当列表大小小于numberOfLetters 整数时。

    Console.WriteLine("Alright smartass, enter your name");
    string Name = Console.ReadLine();
    int numberOfLetters = Name.Length;
    int len = list.Count;
    var rdm = new Random();
    for(int i=0; i<len; i++) {
       // ignoring the nth item
       if(len > 1) {
       list.RemoveAt(rdm.Next(0, len));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多