.NET LINQ在查询中使用Out参数调用方法并使用Out值

qyuhtwio  于 2022-12-06  发布在  .NET
关注(0)|答案(5)|浏览(143)

我有一个对象列表,其中有一个方法,该方法有两个out参数。我如何在每个对象上调用该方法,获得out参数值,并在稍后的查询中使用它们,也许是为了签入where子句?
这是可能的吗?如果是的话,请通过示例代码进行演示。
谢谢你!

qyswt5oh

qyswt5oh1#

也许您应该使用for each循环,然后使用您的查询?
(实际上,如果不知道代码,很难说在这种情况下什么是最好的)

svujldwt

svujldwt2#

下面是在LINQ查询中访问out参数值的一种方法。我认为您不能在以后的select中使用out值。list.Where(...).Select(...)

List<MyClass> list; // Initialize

Func<MyClass, bool> fun = f =>
{
    int a, b;
    f.MyMethod(out a, out b);
    return a == b;
};
list.Where(fun);

MyClass的实现方式如下:

public class MyClass
{
    public void MyMethod(out int a, out int b)
    {
        // Implementation
    }
}
wyyhbhjk

wyyhbhjk3#

这将使用.NET 4.0中的Tuple<T1,T2>,但可以针对早期版本进行调整:

//e.g., your method with out parameters
void YourMethod<T1,T2,T3>(T1 input, out T2 x, out T3 y) { /* assigns x & y */ }

//helper method for dealing with out params
Tuple<T2,T3> GetTupleOfTwoOutValues<T1,T2,T3>(T1 input)
{ 
   T2 a;
   T3 b;
   YourMethod(input, out a, out b);
   return Tuple.Create(a,b);
}

IEnumerable<Tuple<T2,T3>> LinqQuery<T1,T2,T3>(IEnumerable<T1> src, T2 comparisonObject)  
{
   return src.Select(GetTupleOfTwoOutValues)
             .Where(tuple => tuple.Item1 == comparisonObject);
}
ktecyv1j

ktecyv1j4#

您可以使用元组(没有任何帮助器方法):

var text = "123,456,abc";
var items = text.Split(',')
    .Select(x => (long.TryParse(x, out var v), v))
    .Where(x => x.Item1)
    .Select(x => x.Item2);

foreach (var item in items)
{
    Console.WriteLine(item);
}

输出量

123
456

本文提供了一些其他解决方案:https://mydevtricks.com/linq-gems-out-parameters

tsm1rwdh

tsm1rwdh5#

可以使用匿名对象和let关键字:

var texts = new[] { "dog", "2", "3", "cat" };
var checks = from item in texts
             let check = new
             {
                 Word = item,
                 IsNumber = int.TryParse(item, out var n),
                 Value = n,
             }
             where check.IsNumber
             select check;
foreach(var item in checks) 
{
    Console.WriteLine($"'{item.Word}' is the number {item.Value}");
}

相关问题