在我的字符串格式为: "a = 23, b = 432, f = 321, gfs = 413, d = 42, k = 4242, t = 4314, (...etc...)"
- 约30元搜索字符串集合
我需要有很多的字符串的相应的4个元素,e.g搜索的可能性:A,B,d,K。
例如查询口头:give me all string where a = 3, b, = 2, d = 31, k = 1
我应该使用什么类型的集合?我应该创建一个班级吗?有任何想法吗?
在我的字符串格式为: "a = 23, b = 432, f = 321, gfs = 413, d = 42, k = 4242, t = 4314, (...etc...)"
- 约30元搜索字符串集合
我需要有很多的字符串的相应的4个元素,e.g搜索的可能性:A,B,d,K。
例如查询口头:give me all string where a = 3, b, = 2, d = 31, k = 1
我应该使用什么类型的集合?我应该创建一个班级吗?有任何想法吗?
如果你知道你的值是唯一的,我会构造一个哈希表,其中左边的平等是你的关键,右边是你的价值。这将帮助你避免任何串成形可能发生变化,例如额外的空格等
这里是一些代码示例
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;
}
下面是使用辅助功能做的一种方式:
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;
}
现在你可以使用LINQ来获得的项目是这样的:
var keys = new[] {"a", "b", "d", "k"};
var vals = new[] {3, 2, 31, 1};
var res = data.Where(str => HasAll(str, keys, vals)).ToList();
东西LIK e这个查询将起作用,但我会建议将你的值放入与字符串不同的数据结构中。可能是一个带有元素名称的结构,以便您可以查找多个值。
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"));
如果我理解正确的quesiton,这应该这样做
1)创建一个字典,其中的关键是满弦和值是字符串
2)的切割片检查条件与棋子的交集。交叉点的大小与标准大小相同,并且我们有一个匹配项。
[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());
}
那么上面的查询会是什么结果呢? – 2012-07-06 14:58:57