C# 列表仅包含前两项
好的,我很确定iNumber终于开始工作了。谢谢大家的帮助。我想我已经准备好开始这个项目了。我只是想把我的头脑集中在清单上 我正在做的是尝试立即检查一组输入,如果它们是数字,并将结果存储在列表中。这样,为了确定其中一个是否是数字,我只需检查第二个列表中的相应值即可 所以,我的问题是,我在我的列表中明确地放了3件事情,但是当我让它打印出项目的数量时,它总是显示2件。这到底是怎么回事?具体来说,为什么areNumbers总是返回长度为2的列表,而我显然使它至少与numberOfNumbers一样长 PS我知道我的代码看起来还不是很好。在学习风格之前,我想先掌握基本知识C# 列表仅包含前两项,c#,list,C#,List,好的,我很确定iNumber终于开始工作了。谢谢大家的帮助。我想我已经准备好开始这个项目了。我只是想把我的头脑集中在清单上 我正在做的是尝试立即检查一组输入,如果它们是数字,并将结果存储在列表中。这样,为了确定其中一个是否是数字,我只需检查第二个列表中的相应值即可 所以,我的问题是,我在我的列表中明确地放了3件事情,但是当我让它打印出项目的数量时,它总是显示2件。这到底是怎么回事?具体来说,为什么areNumbers总是返回长度为2的列表,而我显然使它至少与numberOfNumbers一样长
static void Main(string[] args)
{
var maybe = new ArrayList(3);
maybe.Add(100f);
maybe.Add("not a number");
maybe.Add(1000);
Console.WriteLine(areNumbers(maybe).Count);
Console.ReadLine();
}
static ArrayList areNumbers(ArrayList maybeNumbers)
{
var theResults = new ArrayList(0);
var numbersEnumerator = maybeNumbers.GetEnumerator();
var numberOfNumbers = 0;
try
{
for (; ; )
{
numberOfNumbers = numberOfNumbers + 1;
numbersEnumerator.MoveNext();
var myIsNumber = isNumber(numbersEnumerator.Current);
var myAreNumbers = new ArrayList(numberOfNumbers);
myAreNumbers.Add(theResults);
myAreNumbers.Add(myIsNumber);
theResults = myAreNumbers;
}
}
catch (InvalidOperationException)
{
return theResults;
}
}
static bool isNumber(object theObject)
{
var s = theObject.GetType().ToString().ToUpper();
Console.WriteLine(s);
return theObject is int || theObject is Int64 || theObject is float || theObject is double;
}
- 摆脱无休止的循环
- 反复浏览你的数字
- 围绕着尝试。。。只抓一个数字
- 摆脱无休止的循环
- 反复浏览你的数字
- 围绕着尝试。。。只抓一个数字
当然,假设isNumber在您的maybe number不是数字时抛出一些execption。1。不要依赖try/catch实现正常的代码流。try/catch用于捕捉异常情况 2.为什么需要构建isNumber方法?double.tryParse或Convert.ToDouble()也会做类似的事情(通过谷歌查找差异) 3.不知道myAreNumbers应该做什么,但基本上是在每次迭代时向新列表添加一个bool和一个列表
static ArrayList areNumbers(ArrayList maybeNumbers)
{
var theResults = new ArrayList(0);
foreach(var possibleNumber in maybeNumbers)
{
double myDouble;
if (double.tryParse(possibleNumber, out myDouble))
theResults.Add(possibleNumber);// OR theResults.Add(myDouble); //depending on what you want
}
return theResults;
}
1.不要依赖try/catch实现正常的代码流。try/catch用于捕捉异常情况 2.为什么需要构建isNumber方法?double.tryParse或Convert.ToDouble()也会做类似的事情(通过谷歌查找差异) 3.不知道myAreNumbers应该做什么,但基本上是在每次迭代时向新列表添加一个bool和一个列表
static ArrayList areNumbers(ArrayList maybeNumbers)
{
var theResults = new ArrayList(0);
foreach(var possibleNumber in maybeNumbers)
{
double myDouble;
if (double.tryParse(possibleNumber, out myDouble))
theResults.Add(possibleNumber);// OR theResults.Add(myDouble); //depending on what you want
}
return theResults;
}
正如评论员所说,返回值
areNumbers
最多是一个包含2项的ArrayList(第一项是0到N-2项的布尔值的ArrayList;第二项是第(N-1)个值的布尔值)。如果我在头脑中正确地处理了代码,那么如果发送空的ArrayList,您将得到一个空的ArrayList
在一项之后:
areNumbers[0]: [] // empty ArrayList
areNumbers[1]: true
如果您是预LINQ,请尝试以下方法:
List<object> maybeNumbers = new List<object>();
maybeNumbers.Add(100f);
maybeNumbers.Add("not a number");
maybeNumbers.Add(1000);
List<object> areNumbers = new List<object>();
foreach(object maybe in maybeNumbers)
{
if (isNumber(maybe))
areNumbers.Add(maybe);
}
正如评论员所说,返回值
areNumbers
最多是一个包含2项的ArrayList(第一项是0到N-2项的布尔值的ArrayList;第二项是第(N-1)个值的布尔值)。如果我在头脑中正确地处理了代码,那么如果发送空的ArrayList,您将得到一个空的ArrayList
在一项之后:
areNumbers[0]: [] // empty ArrayList
areNumbers[1]: true
如果您是预LINQ,请尝试以下方法:
List<object> maybeNumbers = new List<object>();
maybeNumbers.Add(100f);
maybeNumbers.Add("not a number");
maybeNumbers.Add(1000);
List<object> areNumbers = new List<object>();
foreach(object maybe in maybeNumbers)
{
if (isNumber(maybe))
areNumbers.Add(maybe);
}
这将循环遍历一个对象列表,并给出一个布尔响应,让您知道它们是否是数字,我认为这就是您的代码最终要做的
var testNumbers = new List<object>();
testNumbers.Add(15);
testNumbers.Add("AUUUGHH");
testNumbers.Add(42);
foreach (var i in testNumbers)
Console.WriteLine(Microsoft.VisualBasic.Information.IsNumeric(i));
var testNumbers=新列表();
增加(15);
添加(“AUUUGHH”);
增加(42);
foreach(testNumbers中的变量i)
Console.WriteLine(Microsoft.VisualBasic.Information.IsNumeric(i));
确保添加对Microsoft.VisualBasic命名空间的引用以使用IsNumeric()这将循环遍历对象列表,并给出一个布尔响应,让您知道它们是否是数字,我认为这就是您的代码最终要做的
var testNumbers = new List<object>();
testNumbers.Add(15);
testNumbers.Add("AUUUGHH");
testNumbers.Add(42);
foreach (var i in testNumbers)
Console.WriteLine(Microsoft.VisualBasic.Information.IsNumeric(i));
var testNumbers=新列表();
增加(15);
添加(“AUUUGHH”);
增加(42);
foreach(testNumbers中的变量i)
Console.WriteLine(Microsoft.VisualBasic.Information.IsNumeric(i));
确保添加对Microsoft.VisualBasic命名空间的引用,以便使用IsNumeric()尝试以下操作:
static void Main(string[] args)
{
var maybe = new ArrayList(3);
maybe.Add(100f);
maybe.Add("not a number");
maybe.Add(1000);
foreach (var item in maybe)
{
Console.WriteLine(item);
}
ArrayList res = new ArrayList(maybe.ToArray().Where((o) => o.IsNumber()).ToArray());
foreach (var item in res)
{
Console.WriteLine(item);
}
}
public static bool IsNumber(this object item)
{
const TypeCode filter = TypeCode.Double | TypeCode.Int16 | TypeCode.Int32 | TypeCode.Int64
| TypeCode.Single | TypeCode.UInt16 | TypeCode.UInt32 | TypeCode.UInt64;
Type t = item.GetType();
if (t.IsPrimitive)
{
TypeCode code = System.Type.GetTypeCode(t);
return (code & filter) > 0;
}
return false;
}
试试这个:
static void Main(string[] args)
{
var maybe = new ArrayList(3);
maybe.Add(100f);
maybe.Add("not a number");
maybe.Add(1000);
foreach (var item in maybe)
{
Console.WriteLine(item);
}
ArrayList res = new ArrayList(maybe.ToArray().Where((o) => o.IsNumber()).ToArray());
foreach (var item in res)
{
Console.WriteLine(item);
}
}
public static bool IsNumber(this object item)
{
const TypeCode filter = TypeCode.Double | TypeCode.Int16 | TypeCode.Int32 | TypeCode.Int64
| TypeCode.Single | TypeCode.UInt16 | TypeCode.UInt32 | TypeCode.UInt64;
Type t = item.GetType();
if (t.IsPrimitive)
{
TypeCode code = System.Type.GetTypeCode(t);
return (code & filter) > 0;
}
return false;
}
这条线的目的是什么?对于(;;){看起来当MoveNext失败时捕获就抓住了。奇怪,伙计。你在列表中添加了三项。其中两项可以解释为数字,一项不能。然后你从
areNumbers
打印返回值的计数,得到2。2个值是数字。这不是你想要的吗?这是我见过的最糟糕的代码之一。首先,您不是使用foreach
来迭代maybeNumbers
,而是使用GetEnumerator
,一个无限循环,并捕获“MoveNext()”引发的invalidoOperationException
!你可以用一个简单的
foreach`loop来代替所有的混乱。其次,你把bool
s和ArrayList
s的混合物放在一个ArrayList
中。为什么?这个家伙试图学习并征求建议。鼓励他。这行的目的是什么?为了(;;){看起来当MoveNext失败时捕获就抓住了。奇怪,伙计。你在列表中添加了三项。其中两项可以解释为数字,一项不能。然后你从areNumbers
打印返回值的计数,得到2。2个值是数字。这不是你想要的吗?这是我见过的最糟糕的代码之一。首先,您不是使用foreach
来迭代maybeNumbers
,而是使用GetEnumerator
,一个无限循环,并捕获“MoveNext()”抛出的invalidoOperationException
!您可以用一个简单的
static void Main(string[] args)
{
var maybe = new ArrayList(3);
maybe.Add(100f);
maybe.Add("not a number");
maybe.Add(1000);
foreach (var item in maybe)
{
Console.WriteLine(item);
}
ArrayList res = new ArrayList(maybe.ToArray().Where((o) => o.IsNumber()).ToArray());
foreach (var item in res)
{
Console.WriteLine(item);
}
}
public static bool IsNumber(this object item)
{
const TypeCode filter = TypeCode.Double | TypeCode.Int16 | TypeCode.Int32 | TypeCode.Int64
| TypeCode.Single | TypeCode.UInt16 | TypeCode.UInt32 | TypeCode.UInt64;
Type t = item.GetType();
if (t.IsPrimitive)
{
TypeCode code = System.Type.GetTypeCode(t);
return (code & filter) > 0;
}
return false;
}