2017-12-19 6 views
0

によって並べ替え要素を返す:C#の、アンドロイド:文字列で、リストのすべての要素を検索し、ああ、これは厳しいものです一致する文字の数

私は私のリストを持っている:

private List<Tasks> tasks; 

さて、私は、検索要求に一致する名前があれば、リスト "タスク"内のすべての要素を検索するはずの文字列をユーザーが入力できる編集テキストを作成しました。 trueの場合、一致するすべての要素をテキストビューに書き込んで、一致率で並べ替えて表示することになっています。

セイ要素と私のリストに "スカ" を探してイム

  1. Skooma
  2. スケート
  3. スタイル
  4. その順番で返すことになっている

ハーフパイプ:

  1. スケート(3つの文字が一致している)
  2. Skooma(2が一致している)
  3. スタイル(Sのみが一致している)

これは、私はそうではなく、多くの(得ているどのくらいです... )

private string SearchList(string search) 
    { 
     string res = null; 

     tasks = Libary.Instance.getTasksBasedOnSubCategory(1); 

     bool itemExists = tasks.Any(x => x.Name == search); 

     return res; 
    } 

あなたはこれについてどうやって行っていますか? 感謝:)

// MY SOLUTIONあなたに

おかげで、これは(...ちょうどcompletitionのために)私がやったことある

私は文字列に必要なすべてのリストを変換さ
private void FormatListToString(string search) 
     { 
      linLayResults.RemoveAllViews(); 

      for (int x = 0; x < 40; x++) // in jeder sub suchen... könnte dauern und statisch 
      { 

       tasks = Libary.Instance.getTasksBasedOnSubCategory(x); 

       List<string> stringlist = new List<string>(); 

       foreach (var task in tasks) 
       { 
        stringlist.Add(task.Name.ToLower().ToString()); 
       } 

       SortingList(stringlist, search); 

      } 
     } 

     private void SortingList(List<string> list, string keyword) 
     { 
      IEnumerable<string> filterLst = list.Where 
       (s => s.Contains(keyword.ToLower().ToString())); 

      var result = filterLst.OrderBy(s => !s.StartsWith(keyword, StringComparison.OrdinalIgnoreCase)) 
       .ThenBy(s => !s.ToLower().Contains(keyword)); 

      foreach (string s in result) 
      { 
       FormatTextView(s); 
      } 

     } 

     private void FormatTextView(string s) 
     { 
      TextView xy = new TextView(this); 
      xy.Text = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s); 

      xy.SetTypeface(font, TypefaceStyle.Normal); 
      xy.SetTextColor(Color.ParseColor("#000000")); 
      xy.TextSize = 18; 
      xy.SetPadding(Resources.DisplayMetrics.WidthPixels/50, 
          intHeightOfDisplay/50, 0, 0); 

      xy.Click += delegate 
      { 

      }; 

      linLayResults.AddView(xy); 
     } 

リストを作成し、edittextを使用してキーワードごとに検索します。すべての大文字を削除しました。それからすべての文字列のすべての最初の文字の大文字を再度有効にしたテキストビューにすべてを入れてください。

AWESOME!

答えて

1

清潔ではなく、その有効な解決策かもしれません。

public void SortingList(List<string> list,string keyword) 
     { 
      IEnumerable<string> filterLst = list.Where(s => s.StartsWith(keyword[0].ToString(), StringComparison.OrdinalIgnoreCase)); 

      var result = filterLst.OrderBy(s => !s.StartsWith(keyword, StringComparison.OrdinalIgnoreCase)) 
       .ThenBy(s => !s.ToLower().Contains(keyword)); 

      foreach (string s in result) 
      { 
       Console.WriteLine(s); 
      } 

     } 
+0

ありがとうございました。キーワードとして送信すると、結果は最初に入力した文字のみになりますか、間違っていますか? –

+0

はい、開始時だけでなく、開始時から包含時に変更するだけでなく、フェーズのために作業するように変更する場合もあります。 IEnumerable filterLst = list.Where(s => s.contains(keyword [0] .ToString())); – NSKBpro

+0

申し訳ありませんが、私は理解していないようです。私は "キーワード[0]"は何かの最初の文字を意味することを理解しました。もし0から3を変更すると、私の文字列の4番目の文字は何が検索されるでしょう。しかし、私が必要とするのは、「SKA」と入力すると、文字通り名前が「... ska ...」であるという結果しか表示されないことになります。ですから、 "skateboard"という単語はリストされますが、 "skooma"という単語は表示されません。私は最初の質問であなたを誤解して申し訳ありません。私はあなたがupvoteと正しい答えとしてチェックしている場合は、時間があります:)ありがとう! –

1

私は言葉と検索パラメータとの間の一致を評価するためのヘルパー関数を使用します。

private static int GetMatchScore(string word, string pattern) 
{ 
    return pattern.TakeWhile((c, i) => i < word.Length && 
             Char.ToLower(c) == Char.ToLower(word[i])) 
        .Count(); 
} 

GetMatchScoreは見つけるために単語

クエリの最初に一致する文字の数を返し、注文一致は次のようになります:

var words = new List<string>{ "Skooma", "Skate", "Style", "Halfpipe" }; 
string filter = "Ska"; 

var search = words.Select(word => new {word, score = GetMatchScore(word, filter)}) 
        .Where(m => m.score > 0) 
        .OrderByDescending(m => m.score) 
        .Select(m => m.word); 
関連する問題