Foreach仅适用于ListBox的第一项

时间:2014-10-21 11:38:26

标签: c# foreach listbox windows-phone

我的Windows Phone应用程序有一个从JSON填充的ListBox。在我填充ListBox之后,我需要比较ListBox中是否存在用户键入的内容(字符串)。 因此,ListBox上的每个项目都有一个来自集合的3个信息。我只需要比较集合中的一个项目和字符串。

我有一些代码,但这仅适用于ListBox的第一项:

private void addProduto(object sender, RoutedEventArgs e)
{            
    Fields fi = (Fields)this.List1.SelectedItem as Fields;

    foreach(var item in List1.Items)
    {
        Fields fields = item as Fields;

        if (fields.codigo == insCodProduto.Text)
        {
            MessageBox.Show("this product exists!");
            break;
        }
        else
        {
            MessageBox.Show("this product not exists");
            break;
        }
    }
}

收集:

public ObservableCollection<Fields> Items { get; set; }

public class Fields
{
    public string descricao { get; set; }
    public double valor_preco_a { get; set; }
    public string codigo { get; set; }
    public string codigo1 { get; set; }
    public string descricao1 { get; set; }
}

列表框:

<ListBox Name="List1" ItemsSource="{Binding Items}" Margin="0,85,0,0" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="242" />
                    <ColumnDefinition Width="128" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <StackPanel Hold="addToList2" Margin="0,0,-62,17" Grid.ColumnSpan="3">
                    <StackPanel.Background>
                        <SolidColorBrush Color="#FF858585" Opacity="0.5"/>
                    </StackPanel.Background>
                    <TextBlock x:Name="NameTxt" Grid.Column="0" Text="{Binding descricao}" TextWrapping="Wrap" FontSize="20" Style="{StaticResource PhoneTextNormalStyle}"/>
                    <TextBlock Grid.Column="1" Text="{Binding valor_preco_a, StringFormat=N2}" TextWrapping="Wrap" Margin="45,20,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                    <TextBlock Grid.Column="3" Text="{Binding codigo}" TextWrapping="Wrap" FontSize="35" Margin="370,-50,12,0" Style="{StaticResource PhoneTextNormalStyle}" Foreground="Blue"/>
                </StackPanel>
                <TextBlock Grid.Column="0" Text="R$" Margin="15,48,158,17" Style="{StaticResource PhoneTextSubtleStyle}"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

4 个答案:

答案 0 :(得分:2)

由于foreach语句,您的break仅检查第一个值。此外,循环需要检查值匹配,但是您只能知道循环结束后是否没有匹配。所以你需要这样的东西。

bool found = false;
foreach(Fields fields in List1.Items)
{
    if (fields.codigo == insCodProduto.Text)
    {
        MessageBox.Show("this product exists!");
        found = true;
        break;
    }
}

if(!found)
{
    MessageBox.Show("this product not exists");
}

另请注意,如果您在foreach中指定类型,则会为您执行投射。

答案 1 :(得分:2)

vallabha的答案是完全正确的。然而,有另一个也许更简单的解决方案来检查是否存在包含用户输入内容的任何项目。您可以Enumerable.Any< TSource> Method

在您的代码中,这将成为:

var isInListBox = List1.Items.Cast<Fields>().Any(x => x.codigo == insCodProduto.Text);

if (isInListBox)
{
    MessageBox.Show("This product exists!");
}
else
{
    MessageBox.Show("This product doesn't exist.");
}

使用此方法的优点如下(来自MSDN):

  

一旦确定结果,就会停止源的枚举。

答案 2 :(得分:1)

您可以使用LINQ缩短代码以检查是否存在任何匹配项:

if (List1.Items.Cast<Fields>().Any(f => f.codigo == insCodProduto.Text))
    MessageBox.Show("this product exists!");
else
    MessageBox.Show("this product not exists");

它与您尝试实现的代码具有相同的效果,因为Any()在找到匹配项时停止查看集合(并返回True)。否则,它返回False

答案 3 :(得分:0)

当你在第一次迭代后在break循环中使用foreach时,它会破坏foreach循环