Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 在linq中使用out类型_C#_.net_Linq - Fatal编程技术网

C# 在linq中使用out类型

C# 在linq中使用out类型,c#,.net,linq,C#,.net,Linq,可能重复: string[] values = { "1", "2", "3a", "4" }; int i = int.MinValue; var output = (from c in values where int.TryParse(c, out i) select c).Select(s => int.Parse(s)).ToList();

可能重复:

        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }
这可能是一个基本问题,但我无法找到解决办法。我有一个字符串数组,我试图用整数解析它们。正如所料,我得到了格式异常

        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }
我如何跳过3a,继续解析剩余的数组,并使用Linq将整数存储到输出中。?这是一个更好的方法还是一个不做的练习?请说明在这种情况下如何使用TryParse

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] values = { "1", "2", "3a","4" };
            List<int> output = new List<int>();

            try{
                output = values.Select(i => int.Parse(i)).ToList<int>();
            }
            catch(FormatException)
            {
                foreach (int i in output)
                    Console.WriteLine(i);
            }

            foreach (int i in output)
                Console.WriteLine(i);

            Console.ReadLine();
        }

    }
}
        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }
您可以使用int.TryParse

        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }
然后你可以写下:

List<int> output = values.Select(s => s.TryGetInt())
             .Where(nullableInt => nullableInt.HasValue)
             .Select(nullableInt => nullableInt.Value)
             .ToList();
        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }

为什么要使用LINQ

        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }
试试这个:

foreach(string str in values)
{
   int val;
   if(int.TryParse(str, out val))
   {
      output.Add(val);
   }
}
        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }

示例使用Regex进行更多控制,以指示哪些值被视为有效

尽管我完全同意Tim Schmelter的答案中使用int.TryParse,但我认为他的答案依赖于未记录的实现细节,更安全的替代方案可能是

List<int> output =
    values
    .Select(s => {
        int i;
        return int.TryParse(s, out i) ? i : default(int?);
    })
    .Where(i => i != null)
    .Select(i => i.Value)
    .ToList();
        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }

这个怎么样?受Tim答案的启发,但由于临时变量在循环中移动,因此假设字符串值的集合是可并行枚举的,这是并行安全的

values.Select(s =>
    {int i; return int.TryParse(s, out i) ? (int?)i : null;})
    .Where(x=>x!=null).Select(x=>x.Value);
        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }

给定[1,2,3],它会从

        string[] values = { "1", "2", "3a", "4" };
        int i = int.MinValue;
        var output = (from c in values
                      where int.TryParse(c, out i) 
                      select c).Select(s => int.Parse(s)).ToList();
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }

这保证有效吗?我认为在Select读取第一个值之前,Where不能用第二个值覆盖I是没有技术原因的。@hvd:是的,至少在Linq To对象中是这样。虽然我目前没有可用的链接。@hvd:这个答案依赖于延迟执行LINQ到对象的实现细节。在它当前的实现中,当使用LINQ到对象时,它保证工作。我在中看到的是,这个方法是通过使用延迟执行来实现的。立即返回值是存储执行操作所需的所有信息的对象。在通过直接调用对象的GetEnumerator方法或使用Visual C中的foreach或Visual Basic中的foreach枚举对象之前,不会执行此方法表示的查询。但这允许过滤器一次对所有记录进行评估,即使当前的实现没有这样做。我最初对这段代码感到惊讶,但在稍微考虑一下“延迟执行”后,我现在明白了。这是可行的,但我想知道我的方法在LINQ中是否有效。谢谢你的回答。并非所有的解决方法都是最好使用LINQ。这对我很有帮助。但我想看看并理解如何在LINQ中使用out类型。非常感谢您的回答这也是我在回答中所做的,因此LGTM:+1用于创造性思维:只使用int.TryParse的布尔结果,忽略它的输出参数,显然是正确的。我从@Tim Schmelter先生那里得到了这个想法,谢谢你:谢谢你的回答。教了我一些东西。linq版本适合像我们这样的初学者:D@spajce:我们都在使用linq,您在使用query-而我在使用synatx方法。除此之外,这是个好主意,尽管它需要解析字符串两次。谢谢你的回答。了解了显式可重用函数