search List for string .StartsWith()

后端 未结 10 1773
终归单人心
终归单人心 2021-01-19 00:13

I have a

List

with 1500 strings. I am now using the following code to pull out only string that start with the string prefix

10条回答
  •  一个人的身影
    2021-01-19 00:38

    So many approches were analyzed to achive minimum data capacity and high performance. The first place is: all prefixes are stored in dictionary: key - prefix, values - items appropriate for prefix.

    Here simple implementation of this algorithm:

    public class Trie
    {
        #region Constructors
    
        public Trie(
            IEnumerable items,
            Func keySelector,
            IComparer comparer)
        {
            this.KeySelector = keySelector;
            this.Comparer = comparer;
            this.Items = (from item in items
                          from i in Enumerable.Range(1, this.KeySelector(item).Length)
                          let key = this.KeySelector(item).Substring(0, i)
                          group item by key)
                         .ToDictionary( group => group.Key, group => group.ToList());
        }
    
        #endregion
    
        #region Properties
    
        protected Dictionary> Items { get; set; }
    
        protected Func KeySelector { get; set; }
    
        protected IComparer Comparer { get; set; }
    
        #endregion
    
        #region Methods
    
        public List Retrieve(string prefix)
        {
            return  this.Items.ContainsKey(prefix)
                ? this.Items[prefix]
                : new List();
        }
    
        public void Add(TItem item)
        {
            var keys = (from i in Enumerable.Range(1, this.KeySelector(item).Length)
                        let key = this.KeySelector(item).Substring(0, i)
                        select key).ToList();
            keys.ForEach(key =>
            {
                if (!this.Items.ContainsKey(key))
                {
                    this.Items.Add(key, new List { item });
                }
                else if (this.Items[key].All(x => this.Comparer.Compare(x, item) != 0))
                {
                    this.Items[key].Add(item);
                }
            });
        }
    
        public void Remove(TItem item)
        {
            this.Items.Keys.ToList().ForEach(key =>
            {
                if (this.Items[key].Any(x => this.Comparer.Compare(x, item) == 0))
                {
                    this.Items[key].RemoveAll(x => this.Comparer.Compare(x, item) == 0);
                    if (this.Items[key].Count == 0)
                    {
                        this.Items.Remove(key);
                    }
                }
            });
        }
    
        #endregion
    }
    

提交回复
热议问题