0

我需要按单词开头在集合中搜索。

简单收藏{ Ivan Smith、Anthony Clark、Mike Shinoda}

当用户输入“s”时,我需要显示 {Ivan Smith, Mike Shinoda}

这种方法应该有效,但它没有。

     private void SortFriends(object sender, TextChangedEventArgs e) {
          var text = (sender as WatermarkTextBox).Text;
          if (text != string.Empty) {
            text = text.ToLowerInvariant();
            var translatedColl = FriendCollectionTranslated.Where(i => i.FirstName.StartsWith(text) || i.LastName.StartsWith(text) ||
                                                i.FirstNameT.StartsWith(text) ||
                                                i.LastNameT.StartsWith(text));

            var newCollection = ((App)App.Current).CollectionFriends.Where(i => translatedColl.First(n => n.Uid == i.Uid) != null);

            friendsBox.ItemsSource = newCollection;
          }
          else friendsBox.ItemsSource = ((App)App.Current).CollectionFriends;
        }
    public class HumanTranslated {
          public string Uid { get; set; }
          public string FirstName { get; set; }
          public string LastName { get; set; }
          public string FirstNameT { get; set; }//Translit
          public string LastNameT { get; set; }//Translit
          public bool IsChecked { get; set; }
        }
private void PrepareCollection()//Ретранслируем наши данные для быстрого поиска
    {
      foreach (var t in ((App)App.Current).CollectionFriends) {
        var item = new HumanTranslated {
          Uid = t.Uid,
          LastNameT = ToTranslit(t.LastName.ToLowerInvariant()),
          FirstNameT = ToTranslit(t.FirstName.ToLowerInvariant()),
          FirstName = t.FirstName.ToLowerInvariant(),
          LastName = t.LastName.ToLowerInvariant()
        };
        FriendCollectionTranslated.Add(item);
      }
    }
public class Human {
          public string Uid { get; set; }
          public string FirstName { get; set; }
          public string LastName { get; set; }
          public bool IsChecked { get; set; }
        }
4

1 回答 1

2

在 lambda 语句中为每个成员添加相同的 .ToLowerInvariant() 调用。

var translatedColl = FriendCollectionTranslated.Where(
                      i => i.FirstName.ToLowerInvariant().StartsWith(text) ||
                           i.LastName.ToLowerInvariant().StartsWith(text) || 
                           i.FirstNameT.ToLowerInvariant().StartsWith(text) || 
                           i.LastNameT.ToLowerInvariant().StartsWith(text)); 

更好的是,使用 StringComparison.InvariantCultureIgnoreCase

var translatedColl = FriendCollectionTranslated.Where(
              i => i.FirstName.StartsWith(text,StringComparison.InvariantCultureIgnoreCase) ||
                   i.LastName.StartsWith(text,StringComparison.InvariantCultureIgnoreCase) || 
                   i.FirstNameT.StartsWith(text,StringComparison.InvariantCultureIgnoreCase) || 
                   i.LastNameT.StartsWith(text, StringComparison.InvariantCultureIgnoreCase)); 

然后,您可以从文本变量中删除 ToLowerInvariant() 调用。

于 2012-08-11T14:21:32.593 回答