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