C# 查找哪个变量不为null的最佳实践

C# 查找哪个变量不为null的最佳实践,c#,C#,我问这个问题的唯一原因是,为了有效地用谷歌搜索它,很难清楚地表达出来 假设我有1000个不同的变量(1000个整数),我们知道其中只有1个不是空的 如何找到特定变量以获取其值 我曾考虑将所有这些变量插入一个数组并遍历它,直到找到正确的一个,但我想知道是否有更有效的解决方案 首先,我感谢大家的回答。非常抱歉,我没有准确地描述我的问题。我有一个对象,比如说有7个属性(我只写了1000个来强调有3个以上的变量——显然我夸大了…)。不管怎样,我可以检查每一个属性,或者我可以做…什么代替?再次感谢,很抱歉

我问这个问题的唯一原因是,为了有效地用谷歌搜索它,很难清楚地表达出来

假设我有1000个不同的变量(1000个整数),我们知道其中只有1个不是空的

如何找到特定变量以获取其值

我曾考虑将所有这些变量插入一个数组并遍历它,直到找到正确的一个,但我想知道是否有更有效的解决方案

首先,我感谢大家的回答。非常抱歉,我没有准确地描述我的问题。我有一个对象,比如说有7个属性(我只写了1000个来强调有3个以上的变量——显然我夸大了…)。不管怎样,我可以检查每一个属性,或者我可以做…什么代替?再次感谢,很抱歉我误导了你们——我的错

var value = yourList.First(i => i != null);
假设您的列表是可为空的类型(int?或类似类型)

编辑:正如我在回答后所提到的,您可以使用反射来获取所有属性,但由于您要求的是最佳解决方案,因此我建议您应该将变量填入列表(或数组),并使用上面的代码来查找第一个不为空的变量

如果您必须确保只有一个NOTNULL,您可以使用
Single()
,但是如果您不需要仔细检查是否还有其他值,
First()
则效率更高。

var l=new List(){null,null,null,null,null,1,null,null,null,null};
var value = listOfNullables.Single(e => e.HasValue == true);
var value = listOfNullables.First(e => e.HasValue == true);
int?[]l2=l.Where(x=>x!=null).ToArray(); Console.WriteLine(l2[0]);

这是一个例子,如果你想得到一个以上的变量,考虑使用<代码>第一个()/代码>如果你只需要一个

,这样你就不必浪费时间进入代码来添加列表中的变量,所以这是更有效的方式。
class Foo {
    public int? A {get;set;}
    public string B {get;set;}
}

Foo foo = new Foo {A = 1, B = "abc"};
foreach(var prop in foo.GetType().GetProperties()) {
    if(prop.PropertyType == typeof(int?)) // int? can be changed bythe type of your variable
    {
           if(prop.GetValue(foo, null) == null) // null can be changed to your verification, == 0  whatever.
           {
              //do some
           }
    }
}

null
表示
0
?数组中什么是无效的?整数是如何保存的?它们是否在列表、数组或其他对象中?是否可以为null int?因为c#中的int不能为null,如果你有1000个不同的变量,而不是1000个元素的集合,那么你就做错了。@Rotem你能不能给我们展示一些关于我们工作的结构的代码,以及为什么你选择定义这么多变量而不是以其他方式存储。最终要求是什么?有1000个变量,你想达到什么目的?他没有
yourList
,请再读一次他的最后一句话。或者你可以使用
HasValue
@wudzik是的,我先这样输入,但这只适用于可为空的值类型null将适用于每种引用类型。除非绝对确定至少有一个非null变量,否则我不会使用First()。如果集合中没有任何内容,First()将引发异常。同样,如果有多个,Single()将抛出。总是使用
xxxOrDefault()
变量。你为什么喜欢
.ToArray()[0]
而不是
.First()
?@Jon只是一种不同的方法我会说“无条件更差”的方法,但我想这只是“不同”的一个子集。@Jon他可以用我的例子来获得不止一种variable@Sam不,他不能,如果你一字不差的话。很明显,您是在使用
Where
而不是
First
,在这种情况下,如果我们方便地忽略
.ToArray()[0]
,您是正确的。事实上,你的方法是有潜在危险的,因为它假设总是至少有一个非空值(我不会坚持“并且说我们个人知道只有一个非空值位)。请不要!”如果你有1000个不同的变量,而不是1000个元素的集合,那么你就做错了“OP正在寻找一种有效的方法,而不是一种低效、危险、可读性较差的方法。如果
typeof(int)
为真,那么
prop.GetValue
将永远不会为空。我严重怀疑反射比遍历数组更有效。如果OP已经有1000多个变量(即不在集合中),typeof(int)将永远不会为空。”,他显然不介意编写一些代码:)您不需要Where,您可以将lambda传递给Single(),但是如果他不需要再次检查集合中是否有多个notnull,First()将更有效。
class Foo {
    public int? A {get;set;}
    public string B {get;set;}
}

Foo foo = new Foo {A = 1, B = "abc"};
foreach(var prop in foo.GetType().GetProperties()) {
    if(prop.PropertyType == typeof(int?)) // int? can be changed bythe type of your variable
    {
           if(prop.GetValue(foo, null) == null) // null can be changed to your verification, == 0  whatever.
           {
              //do some
           }
    }
}