Saya memiliki Daftar string dalam memori yang berisi dua item: 'produk 1 maks' dan 'produk 1 menit'. Bagaimana saya bisa mencari dan mendapatkan 'produk 1 menit' ketika input pengguna adalah 'produk min'?

Perhatikan ada beberapa kata yang hilang di tengah.

var list = new List<string> {"product 1 max", "product 1 min" };
//user input 'product min' and he expected 'product 1 min'
-1
Abdussalam Ashuaebi 3 Januari 2021, 21:51

3 jawaban

Jawaban Terbaik

Jika Anda membagi input menjadi kata, Anda dapat memfilter list ke kecocokan yang berisi semua kata input:

var inputWords = input.Split(' ');
var ans = list.Where(s => inputWords.All(s.Contains)).ToList();

CATATAN: s.Contains adalah cara yang lebih pendek, lebih efisien (lebih tidak jelas) untuk melakukan w => s.Contains(w)

1
NetMage 4 Januari 2021, 19:20

Salah satu cara untuk melakukannya adalah dengan membagi input dan mencocokkannya dengan setiap kata dalam daftar string.

var list = new List<string> { "product 1 max", "product 1 min" };
var input = "product min";
List<string> inputParts = input.Split(' ').ToList();

// contains all the input strings
List<string> results = list.Where(x => x.Split(' ').Intersect(inputParts).Count() == inputParts.Count).ToList();

// partial matching strings
List<string> partialMatches = list.Where(x => x.Split(' ').Intersect(inputParts).Count() > 0).ToList();

Dokumentasi tentang metode Intersect dapat ditemukan di sini

1
Jawad 4 Januari 2021, 13:16

Salah satu cara untuk mencapainya adalah dengan menggunakan algoritma Damerau-Levenshtein. Ini algoritma yang pada dasarnya menghitung berapa banyak perubahan yang diperlukan untuk satu string menjadi sama dengan yang lain, ini dapat diimplementasikan secara manual tetapi agak rumit dan sudah ada perpustakaan (SoftWx.Match) yang merangkum logika untuk Anda.

SoftWx.Match memiliki metode statis yang disebut DamerauOSA(string value1, string value2) yang mengembalikan double antara 0 dan 1 yang memberi tahu bagaimana kedua string tersebut, mencampurnya dengan LINQ Anda dapat dengan mudah.

List<string> products = new List<string>()
{
    "product 1 max",
    "product 1 min"
};
var stringToCompare = "product min";

products.ForEach(x => Console.WriteLine($"Item {x} against {stringToCompare} has {Similarity.DamerauOSA(x, stringToCompare)} points of similarity"));

// 0.80 is an arbitrary number of how much "equality" you want from both strings
var filtered = products.Where(x => Similarity.DamerauOSA(x, stringToCompare) > 0.80).ToList();

Console.WriteLine("Filtered");
filtered.ForEach(x => Console.WriteLine(x));

Contoh kerja di sini

0
Andre.Santarosa 3 Januari 2021, 21:26