我将用户输入与我的2d数组进行比较,这是下面的代码
string[,] Arr = new string[,]{
{"A1" , " A2" , " A3" , " A4" , " A5"},
{"B1" , " B2" , " B3" , " B4" , " B5"}};
即时使用此代码进行比较
bool invalid = Enumerable.SequenceEqual(UserInput, Arr);
如果用户输入了不在数组
中的字符串,我想输出无效答案 0 :(得分:2)
虽然LINQ可能使代码看起来“干净”,但您必须了解它仍然必须检查数组的每个元素以确定是否存在所请求的项目。
如何在内部完成此操作可能会或可能不会比您手动编码更有效。实际上,我已经看到很多情况下,程序员通过将现有代码转换为LINQ来使其应用程序效率更低,因为它更“干净”。
例如,要求LINQ收集满足特定条件的项目列表,然后循环遍历结果集比直接循环效率低得多:如果您要查找的项目位于列表的最后位置,你可以使用LINQ循环遍历列表两次,然后迭代项而不是一次直接循环。
现在将上述信息应用于您的具体问题,真正的问题是您在比赛时想要做什么?如果您尝试在条目的数组中找到位置,则有一种方法。如果您只是想验证条目,那么有一种不同的方法。
如果这是我的应用程序,数组并不大,我只是想验证数组中项的存在,我会将数组加载到一个case / culture-insensitive Hashset然后使用Contains方法确定用户的输入是否有效。这种方法的主要原因是Contains方法具有O(1)性能。
如果在循环中获取用户输入,请在循环之前添加以下内容:
var cItems = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
foreach (var sValue in Arr)
{
cItems.Add(sValue);
}
然后,在循环中,添加它以测试用户输入的存在:
if (!cItems.Contains(UserInput))
{
System.Diagnostics.Debug.WriteLine("Invalid Entry");
}
如果您要求大量输入,这将非常有效,因为您只需要将数组转换一次。
如果将来要查找输入项目的X / Y坐标,则会有不同的方法,具体取决于数组中的数据量以及用户期望的输入量。
答案 1 :(得分:1)
只需使用String input = Console.ReadLine()接受字符串; 然后在数组上使用foreach并将其与输入进行比较。
使用它,虽然很长:
bool c =false;
string[,] Arr = new string[,]{
{"A1" , "A2" , "A3" , "A4" , "A5"},
{"B1" , "B2" , "B3" , "B4" , "B5"}};
Console.Write("Input: ");
string input = Console.ReadLine();
foreach (String temp in Arr)
{
c = input.Equals(temp);
if (c)
break;
}
if (c)
Console.Write("Your input is on the array.");
else
Console.Write("Your input is not on the array.");
Console.ReadLine();
}
答案 2 :(得分:0)
如果用户输入的字符串不在,我想输出无效 数组
为了以这种方式比较两个阵列,你必须展平你的2D阵列&#34; Arr&#34;使用Enumerable.SelectMany进入1D数组。然后在具有Linq查询的展平数组上使用带有Enumerable.Any的UserInput上的Enumerable.Contains。
UserInput也必须是一个数组!
示例:
var flattenArr = Arr.SelectMany(x=>x).ToArray();
bool invalid = UserInput.Any(x => !flattenArr.Contains(x));
如果&#34; flattenArr&#34;中没有包含UserInput的任何元素。它返回真实。
不要忘记使用System.Linq。