【问题标题】:Display player names after getting from user [duplicate]从用户获取后显示玩家名称[重复]
【发布时间】:2017-10-06 11:26:22
【问题描述】:

从用户那里读取播放器详细信息并将其分配给播放器类对象。将对象添加到 Player 类型的列表中,并编写一个 linq 查询以从列表中检索玩家名称。 在 LINQ 中使用基本的选择查询。

Player[] p=new Player[100];

for(i=0;i<;i++) {
    p[i]=new Player();
    p[i].PlayerName=Console.ReadLine();
}

Console.WriteLine("Player list:");

var pl=from t in p select t;

// While printing I am getting System.Linq.Enumerable+c__Iterator10`2[Player,Player]
Console.WriteLine(pl);      

【问题讨论】:

  • @HimBromBeere 老实说,他们实际上已经尝试过一些东西,只是在他们得到了意想不到的结果时没有费心去谷歌搜索。
  • 想一想... p1 一个包含 100 个玩家姓名的 IEnumerable。你期望它的 toString 值是多少?

标签: c# linq


【解决方案1】:

打印消息是因为 LINQ 查询返回的对象没有自定义 ToString 方法。因此,调用Console.WriteLine 只会打印类型名称。

您可以通过以下方式打印它:

p.ToList().ForEach(Console.WriteLine);

【讨论】:

  • OP 显然是初学者,即使这是一个骗局或离题,但可能值得解释您的答案,以便清楚到底发生了什么。
  • @TheLethalCoder 我不是已经在第一段中提供了解释吗?
  • 关于他们的代码错误的原因,而不是你的代码是如何工作的。
【解决方案2】:
var pl=from t in p select t;

只是返回查询。要获取您应该像这样使用的列表。

 var pl = (from t in p select t).ToList();

【讨论】:

  • 那我将如何逐行打印呢?
  • 试试这个,for (int i = 0; i
【解决方案3】:
 Player[] p=new Player[100];

   for(int i=0;i<p.Length;i++) {
        p[i]=new Player();
        p[i].PlayerName="SomeName";
    }

    Console.WriteLine("Player list:");

    var pl=from t in p select t.PlayerName;

    foreach(var name in pl)
        Console.WriteLine(name);

选择t.PlayerName,而不是选择t(选择播放器对象)。这将返回 PlayerName 属性的 IEnumerable。您可以稍后循环遍历此 IEnumerable 并显示字符串

【讨论】:

  • 打印正确,但最后显示一些异常
  • 未处理异常:System.NullReferenceException:对象引用未设置为 Program 中的对象实例。
  • m__0 (.Player t) [0x00000] in :0 at System.Linq.Enumerable+c__Iterator10`2[Player,System.String].MoveNext () [0x00000] in :0 at Program。 Main (System.String[] args) [0x00000] in :0
  • 在填充数组时,空引用必须来自代码。确保为数组中的每个索引创建 Player 对象。检查 for 循环的上限
  • for(i=0;i
【解决方案4】:

LINQ 的结果始终是一个表达式,它将在您使用它时执行,或者调用诸如 Distinct 之类的方法。在您的情况下,出于同样的原因,您也会看到一个迭代器。

稍微修改一下代码

var pl=from t in p select t.Name;

// While printing I am getting 
System.Linq.Enumerable+c__Iterator10`2[Player,Player]
foreach(var p in p1)
    Console.WriteLine(p);

编辑:

您的主要内容已被修改以解决问题

int n, i;
Console.WriteLine("Enter number of players");
n = int.Parse(Console.ReadLine());

Player[] p = new Player[n];

Console.WriteLine("Enter the player names");

for (i = 0; i < n; i++)
{
    p[i] = new Player();
    p[i].PlayerName = Console.ReadLine();
}

Console.WriteLine("Player list:");

var pl = from t in p select t.PlayerName;
foreach (var name in pl) Console.WriteLine(name);

【讨论】:

  • 它可以工作,但最后出现异常
  • 您看到的异常是什么?
  • 未处理的异常:System.NullReferenceException:对象引用未设置为 Program 中的对象实例。 m__0 (.Player t) [0x00000] in :0 at System.Linq.Enumerable+c__Iterator10`2[Player,System.String].MoveNext () [0x00000] in :0 at Program.Main (System.String[] args ) [0x00000] 在 :0
  • 请在此处添加您的程序。让我看看怎么回事
  • 使用系统;使用 System.Linq;使用 System.Collections.Generic;公共类程序 { public static void Main(String[] args) { int n,i;玩家[] p=新玩家[100]; Console.WriteLine("输入玩家人数"); n=int.Parse(Console.ReadLine()); Console.WriteLine("输入玩家姓名"); p[n]=新玩家(); for(i=0;i
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多