Home > OS >  C# Linq Query return empty value
C# Linq Query return empty value

Time:08-09

public ListExercieseViewModel()
    {
        ListOfItemsSource = new ObservableCollection<Items>();
        ListOfItemsSource.Add(new Items() { MainText="First" , SecondText="Test"});
        ListOfItemsSource.Add(new Items() { MainText="Second" , SecondText="Test"});
        ListOfItemsSource.Add(new Items() { MainText="Third" , SecondText="Test"});
        ListOfItems = ListOfItemsSource.ToList();
        SearchBar = new Command(OnTextChanged);

    }

public string TextChanging
    {
        get
        {
            return _TextChanging;
        }
        set
        {
            if (value != null)
                _TextChanging = value;
        }
    }
    public List<Items> ListOfItems
    {
        get;
        set;
    }
    public ObservableCollection<Items> ListOfItemsSource
    {
        get;
        set;
    }
public class Items : INotifyPropertyChanged
{
    public string _MainText;
    public string _SecondText;
    public string MainText
    {
        get
        { 
            return _MainText; 
        }

        set 
        {
            if (value != null)
                _MainText =  value;
            NotifyPropertyChanged(); 
        }
    }
    public string SecondText
    {
        get => _SecondText;
        set
        {
            if (value != null)
                _SecondText = value;
            NotifyPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

the problem is here:

public void OnTextChanged()
    {
        if (!String.IsNullOrEmpty(_TextChanging))
            ListOfItems = ListOfItemsSource.Where(x => x.MainText.StartsWith(TextChanging)).ToList();
        else
            ListOfItems = ListOfItemsSource.ToList();
    }

I try to make a filter for my elements, i use Linq to do that, but i have a problem

initially the values ​​from ListOfItemsSource are "First", "Second", "Third", after TextChanging = "Th", count from ListOfItems are 0, but i need to filter this information to show "Third"

What is wrong

CodePudding user response:

In the comments, you mention that you enter exactly "th" into the search box and expect a match with "Third". If you call string.StartsWith without any parameters that configure the comparison, the comparison is case-sensitive. Hence "th" is no match, but "Th" would be.

The easiest way to fix this is to add a parameter that specifies that the comparison should be case-insensitive, e.g.

ListOfItems = ListOfItemsSource
  .Where(x => 
    x.MainText
     .StartsWith(
       TextChanging, 
       StringComparison.CurrentCultureIgnoreCase))
  .ToList();

See this link for the available options.

As an alternative, you could convert the strings in the list and the text you are looking for to lowercase before comparing.

  • Related