简体   繁体   中英

How to display the strings from a list of strings that contain all the chars from a char array? c#

I have a list of strings and a char array of letters. And I want to display the strings that contain all the chars from the array in the string.

List-list of strings charsArray-array of chars Final-the final list with the sorted words

Example

charsArray  {'a','e','i','z'}
List {"abcde","iertaz","aio","zzeml","amoioze"}
Final(output)  iertaz amoioze

I tried this

foreach(string word in List)
{
    bool contain = true;
    foreach (char letter in charsArray}
    {
        if (word.Contains(letter) && contain)
        {
            Final.Add(word);
        }
        else
        {
            contain = false;

        }

    }

}
foreach (string word in Final)
{
    Console.WriteLine(word);
}

Having

char[] chars = new char[] {
  'a','e','i','z'};

List<string> list = new List<string>() {
  "abcde", "iertaz", "aio", "zzeml", "amoioze" };

We can try subtracting word from chars : if all characters from chars are removed, the word is what we want:

using System.Linq;

...

var result = list
  .Where(word => !chars.Except(word).Any())
  .ToList();

This solution uses All :

var charsArray = new char[] { 'a', 'e', 'i', 'z' };
var L = new[] { "abcde","iertaz","aio","zzeml","amoioze"}.ToList();

var final = L.Where(word => charsArray.All(a => word.Contains(a))).ToList();

The result is correct:
iertaz
amoioze

How about this, demonstrated here

public static IEnumerable<IEnumerable<T>> ContainsAll<T>(
                                            this IEnumerable<IEnumerable<T>> source,
                                            IEnumerable<T> search,
                                            IEqualityComparer<T> comparer = default)
{
    ArgumentNullException.ThrowIfNull(source);
    ArgumentNullException.ThrowIfNull(search);
    comparer ??= EqualityComparer<T>.Default;
    
    var searchSet = search is HashSet<T> ss && ss.Comparer == comparer
        ? ss
        : new HashSet<T>(search, comparer);

    return source.Where(item => searchSet.IsSubsetOf(item));
}

That you can use like this,

var words = new[] {"abcde","iertaz","aio","zzeml","amoioze"};
var search = new[] {'a','e','i','z'};
foreach (string match in words.ContainsAll(search))
{
    Console.WriteLine(match);
}

In this line you are adding the word if the first character is in the word because contain is true

...
if (word.Contains(letter) && contain)
        {
            Final.Add(word);
        }
...

you are almost there, you just need a little modification to avoid the mistake above

foreach(string word in List)
{
    bool contain = true;
    foreach (char letter in charsArray}
    {
        if (!word.Contains(letter))
        {
            contain = false;
        }
    }

  if (contain) 
  {
    Final.Add(word);
  }

}
foreach (string word in Final)
{
    Console.WriteLine(word);
}

You want to find strings that contain all the chars from charsArray . It means every char in charsArray should be contained by the target string.

using System.Linq;

var List = new List<string>() { "abcde", "iertaz", "aio", "zzeml", "amoioze" };
var charsArray = new char[] { 'a','e','i','z' };
var result = List.FindAll(word => charsArray.All(letter => word.Contains(letter)));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM