【问题标题】:Check Object type in List of Objects检查对象列表中的对象类型
【发布时间】:2016-01-20 05:33:24
【问题描述】:

获得了一个带有 StackPanel 的 WPF 表单,其中包含带有 StackPanel 的扩展器。

<Expander Name="eSoftware" Header="5 Software">
    <StackPanel Name="StSoftware" Orientation="Horizontal" HorizontalAlignment="Left"  Margin="0,0,8,0">
        <StackPanel Margin="0,10" Width="29">
            <Image x:Name="img" Height="26" Source="Images/3453120.png" Stretch="Fill" Margin="0,0,0,0"/>
        </StackPanel>
        <StackPanel  Margin="0,10">
            <Label  x:Name="lbl" Content="Label"  Margin="0,0,0,0" />
        </StackPanel>
    </StackPanel>
</Expander>

我在对象列表中阅读了扩展器的内容。 现在我必须知道列表是否包含堆栈面板类型的对象。

List<Object> tmpList = new List<Object>();
tmpList = ReadChild((StackPanel)exp.Content)  //gives out the content of an expander. In the Upper case it is 2 StackPanels

if(tmpList.Contains.typeof(StackPanel)=true) //that's wrong
{
  //search for the Stackpanel with lables in it
}

【问题讨论】:

  • 您可能想要比较而不是赋值:tmpList.Contains.typeof(StackPanel)=truetmpList.Contains.typeof(StackPanel)==true

标签: c# wpf list types


【解决方案1】:

您可以使用OfType&lt;&gt; 过滤列表中的特定类型。我了解您想要遍历所有 StackPanel(在列表中),因此您可以执行以下操作:

foreach(var panel in tmpList.OfType<StackPanel>()){
    //your work here ...
}

如果你想检查是否有任何 StackPanel,那么使用这个:

if(tmpList.OfType<StackPanel>().Any()){
    //...
}

【讨论】:

  • @Shadow 这就是我对您想要的内容的理解,但如果是这样,您可以查看我的编辑以获得更好的代码。
  • @Shadow OfType&lt;&gt; 在这种情况下非常有用,您可以通过tmpList.OfType&lt;StackPanel&gt;().Any() 更简单地做到这一点
  • 是的。我改变它。这个比较好。谢谢!
【解决方案2】:

回答这部分问题的问题并不多。 “现在我必须知道列表是否包含堆栈面板类型的对象。” 可以通过以下方式实现:

if (tmpList.Any(x=>x.IsTypeOf(StackPanel)))
{
     //returns true if there are any stack panels in the list 
}

【讨论】:

  • 必须。 if (objList.Any(x => x.GetType() == typeof(StackPanel))) 但它有很大帮助。谢谢!
【解决方案3】:

我会这样做:使用Enumerable.OfType&lt;&gt;()

更多信息:https://msdn.microsoft.com/en-us/library/vstudio/bb360913(v=vs.100).aspx

foreach(var stackpanel in tmpList.OfType<StackPanel>())
{
    // search for the label. (the same trick)
    var myLabel = stackpanel.Children.OfType<Label>().FirstOrDefault();

    // if the label can't be found, continue to the next one.
    if(myLabel == null)
        continue;

    myLabel.Content = "whatever";
}

【讨论】:

    【解决方案4】:

    如果我理解正确,您可以使用此 LINQ 表达式

    var w = tmpList.Where(x=>x.IsTypeOf(StackPanel)).SingleOrDefault();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多