score:1

if you know that your values are unique, I would construct a hash table where the left hand side of the equal is your key and the right is your value. this will help you avoiding any string formation that might change, for example extra spaces etc.

here is some code sample

static void Main(string[] args)
{
    string str = "a = 23, b = 432, f = 321, gfs = 413, d = 42, k = 4242, t = 4314";
    Dictionary<string,string> dictionary = ConstructDictionary(str);
    // Now you can find what you want in your dictionary
}

private static Dictionary<string,string> ConstructDictionary(string str)
{
    string[] pairs = str.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); // this will give you all the pairs X = Y
    Dictionary<string, string> dictionary = new Dictionary<string, string>();
    foreach (string pair in pairs)
    {
        string[] keyValue = pair.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); // this will create an array of size 2 where 
        array[0] = key and array[1] = value;
        string key = keyValue[0].Trim();
        string value = keyValue[1].Trim();
        if (!dictionary.ContainsKey(key))
        {
            dictionary.Add(key, value);
        }
    }
    return dictionary;
}

score:1

Here is one way of doing it using an auxiliary function:

private static bool HasAll(string s, string[] keys, int[] vals) {
    if (keys.Length != vals.Length) throw new ArgumentException("vals");
    var tt = s.Split(new[] {' ', ',', '='});
    for(var i = 0 ; i != keys.Length ; i++) {
        var pos = Array.IndexOf(tt, keys[i]));
        if (pos < 0 || pos == vals.Length-1 || !tt[i+1].Equals(vals[i].ToString())) {
            return false;
        }
    }
    return true;
}

Now you can use LINQ to get the items like this:

var keys = new[] {"a", "b", "d", "k"};
var vals = new[] {3, 2, 31, 1};
var res = data.Where(str => HasAll(str, keys, vals)).ToList();

score:0

Something like this query will work, but I would recommend putting your values into a different data structure than a string. Possibly a struct with the element names so that you can look up multiple values.

string s1 = "a = 32, b = 432, f = 321, gfs = 43, d = 42, k = 4, t = 44";
string s2 = "a = 23, b = 432, f = 321, gfs = 413, d = 42, k = 4242, t = 4314";
string s3 = "a = 23, b = 21, f = 321, gfs = 413, d = 42, k = 4242, t = 4314";
var array = new string[] { s1, s2, s3 };

var result = array.Where(s => s.Contains("f = 321") && s.Contains("b = 432"));

score:1

If I understand the quesiton correctly, this should do it

1) Create a dictionary where the key is the full string and the value is the split pieces of the string

2) Check for intersection of the criteria with the pieces. Intersection size is same as criteria size and we have a match.

[TestMethod]
public void FindValuesInStrings() {

  var strings = new[] {
     "a = 23, b = 432, f = 321, gfs = 11, d = 42, k = 4242, t = 4314",   //A
     "a = 12, b = 123, f = 456, gfs = 11, d = 42, k = 4242, t = 4314",   //B
     "a = 11, b = 456, f = 789, gfs = 413, d = 42, k = 4242, t = 4314",  //C
     "a = 23, b = 789, f = 12,  gfs = 13, d = 42, k = 4242, t = 4314",   //D
  };


   var dict = new Dictionary<string, IEnumerable<string>>();
   foreach (var str in strings) {
      dict.Add(str, str.Split(',').Select(s => s.Trim()));
   }


   // finds the two entries where a = 23 (A & D)
   var criteria = new[] { "a = 23" };
   var found = dict.Where(entry => 
       entry.Value.Intersect(criteria).Count() == criteria.Count()).Select(entry => entry.Key);

   Assert.AreEqual(2, found.Count());

   // finds the single entry where a = 23 and gfs = 11 (A)
   criteria = new[] { "a = 23", "gfs = 11" };
   found = dict.Where(entry => 
        entry.Value.Intersect(criteria).Count() == criteria.Count()).Select(entry => entry.Key);

   Assert.AreEqual(1, found.Count());

}

Related Articles