Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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/0/vba/15.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# - Fatal编程技术网

c#返回客户名称的字符串

c#返回客户名称的字符串,c#,C#,我是C#的新手,正在尝试解决一些简单的任务,我发现自己陷入了一种方法中,该方法应该是从列表的右侧获取下一位客户的姓名: 任务: 我得到的是一个客户有向图,其中一个客户对下一个客户只有一个引用,如果是最后一个客户,则为空。下图中可以看到这样一个图表的示例。 给定这样一个图,我需要通过实现IFinder接口从图的右侧找到右节点的customer int numberFromRight 这是我一直在编写的代码 class Program { static void Main(string[]

我是C#的新手,正在尝试解决一些简单的任务,我发现自己陷入了一种方法中,该方法应该是从列表的右侧获取下一位客户的姓名:

任务: 我得到的是一个客户有向图,其中一个客户对下一个客户只有一个引用,如果是最后一个客户,则为空。下图中可以看到这样一个图表的示例。 给定这样一个图,我需要通过实现IFinder接口从图的右侧找到右节点的customer int numberFromRight

这是我一直在编写的代码

class Program
{
    static void Main(string[] args)
    {
        var currentCustomer = Customers
            .Create("Kim")
            .Previous("Hans")
            .Previous("Ole")
            .Previous("Peter");

        while (currentCustomer != null)
        {
            if (currentCustomer.Next != null)
                Console.Write(currentCustomer.Person + " -> ");
            else
                Console.WriteLine(currentCustomer.Person);

            currentCustomer = currentCustomer.Next;
        }

        Console.ReadLine();
    }
}
客户类别

public class Customers
{
    private Customers(Customers next, string person)
    {
        Next = next;
        Person = person;
    }

    public Customers Next { get; }
    public string Person { get; }

    public Customers Previous(string person)
    {
        return new Customers(this, person);
    }

    public static Customers Create(string person)
    {
        return new Customers(null, person);
    }
}
IFinder接口

public interface IFinder
{
    string FromRight(Customers customers, int numberFromRight);
}
我想用这个方法写我的答案,在下面的图表中,示例中,
FromRight(peter,3)
的结果是Ole:

public class Finder : IFinder
{
    public string FromRight(Customers customers, int numberFromRight)
    {
        return name;
    }
}
任务:我得到的是一个客户有向图,其中一个客户对下一个客户有一个引用,如果是最后一个客户,则为空

所以基本上你的记忆中有一个链表。虽然它们有一些优点,但它们很少在树结构之外使用,这正是因为它们是一种难以读取或随机访问的工具

我想用这个方法写我的答案,在例子中是在 FromRight(peter,3)的结果下面的图表是Ole:

这是递归,数字是递归深度。大概是这样的:

  public string FromRight(Customers customers, int numberFromRight)
    {
    if(numberFromRight <= 0)
      return customers.Name;
    else
      return FromRight(customer.Next, (numberFromRight-1));
  }
FromRight的公共字符串(客户,int numberFromRight)
{

如果(numberFromRight您还没有真正向我们展示到目前为止您在这里所做的尝试,那么就给我们分配任务吧

下面是理论上的答案:

将递归与以下内容一起使用:

  • 如果下一个客户不存在,则您位于列表的末尾,因此您可以直接返回一个值
  • 如果下一个客户确实存在,那么答案是下一个客户的答案加上一

    • 无递归的简单解决方案:

          public class Finder : IFinder
          {
              public string FromRight(Customers customers, int numberFromRight)
              {
                  return Unwind(customers).Reverse().Skip(numberFromRight - 1).FirstOrDefault()?.Person;
              }
      
              private static IEnumerable<Customers> Unwind(Customers customers)
              {
                  while (customers != null)
                  {
                      yield return customers;
                      customers = customers.Next;
                  }
              }
          }
      
      公共类查找器:IFinder
      {
      右起的公共字符串(客户,int numberFromRight)
      {
      返回展开(客户)。反转().Skip(numberFromRight-1)。FirstOrDefault()?.Person;
      }
      私有静态IEnumerable展开(客户)
      {
      while(客户!=null)
      {
      回报客户;
      客户=客户。下一步;
      }
      }
      }
      
      FYI,下面没有可见的图形,虽然我不确定你是否需要它。那么你是说你需要从有向图的末尾找到第n个客户名称?这意味着你必须逆着图的方向遍历客户列表?例如,第一个客户名称是最后一个,第二个是最后一个之前的,第三个嗨,Lasse,是的,确切地说,练习是实现这个图表的目的吗?只是想知道,如果不是你可以考虑使用LinKeDISTIF你使用你的图形,那么升级你的图形是明智的,所以它知道头、尾节点和节点的数量,所以你可以更容易地找出哪一个是TH。e end-3(nodecount-3 noses from head,or tail.prev.prev.prev.prev.prev.prev)那不是“从左”吗?@LasseVågsætherKarlsen:下一个似乎是右的。链表通常至少是从左到右写的。没有示例列表很难说。这就是我的观点,“从右”不同于“从右”.在我的前面,右边的第一个客户与右边的第一个客户不同。从右边我读到“从最后到第一”“@MishMish那么你的exampel问题毫无意义。Ole从一开始就是彼得的1对2。我不知道他会在哪里。3@LasseVågsætherKarlsen反转方向非常简单。但实际上,我们正在等待合适的需求+示例列表。