private void button1_Click(object sender, EventArgs e)
{
Dictionary<TextBox, string> map = new Dictionary<TextBox, string>();
Dictionary<TextBox, string> mapT1 = new Dictionary<TextBox, string>();
Dictionary<TextBox, string> mapT2 = new Dictionary<TextBox, string>();
foreach (Control c in this.Controls)
{
if (c is TextBox)
{
map.Add((c as TextBox), (c as TextBox).Text);
}
}
//复制map给mapT1,mapT2用于第二组合第三组比较
foreach (KeyValuePair<TextBox,string> key in map)
{
mapT1.Add(key.Key,key.Value);
mapT2.Add(key.Key,key.Value);
}
//模拟常数项
string[] s1 = { "1","2","3"};
string[] s2 = { "3","4","5"};
string[] s3 = { "4","5"};
//测试标记法
//使用foreach集合遍历后的标记是倒叙方式
//应为后续方法都是用foreach遍历,所以倒叙可以忽略
int[] fl = new int[map.Count()];//标记项
int k = map.Count();
int i = 0;//用于记录对比的连续性
foreach (KeyValuePair<TextBox,string> key in map)
{
k--;
if (s1.Where(s => s == key.Value).Count() > 0)
{
i++;
}
else { i = 0; }
if (i == s1.Length)//当i=s1的长度,证明是第一个连续项,并记录在标记项
{
fl[k] = 1;
fl[k + 1] = 1;
fl[k + 2] = 1;
}
}
k = map.Count(); i = 0;
//根据标记更改
foreach (KeyValuePair<TextBox, string> key in map)
{
k--;
if (fl[k] == 1)
{
key.Key.BackColor = Color.Red;
mapT1.Remove(key.Key);
mapT2.Remove(key.Key);
}
}
//第二次判定
//先清零标记项
for (int j = 0; j < fl.Length; j++)
{
fl[j] = 0;
}
//设置初始项,判定标记项
//如果第一组没执行,那么mapT1=map。如果执行了mapT1就是减值后的键值对。
k = mapT1.Count(); i = 0;
foreach (KeyValuePair<TextBox, string> key in mapT1)
{
k--;
if (s2.Where(s => s == key.Value).Count() > 0)
{
i++;
}
else { i = 0; }
if (i == s2.Length)
{
fl[k] = 1;
fl[k + 1] = 1;
fl[k + 2] = 1;
}
}
k = mapT1.Count(); i = 0;
//根据标记更改颜色
foreach (KeyValuePair<TextBox, string> key in mapT1)
{
k--;
if (fl[k] == 1)
{
key.Key.BackColor = Color.Red;
mapT2.Remove(key.Key);
}
}
//黄色更改标记
for (int j = 0; j < fl.Length; j++)
{
fl[j] = 0;
}
//应为要完全包含 我理解为也是需要连续的
k = mapT2.Count(); i = 0;
foreach (KeyValuePair<TextBox,string> key in mapT2)
{
k--;
if (s3.Where(s => s == key.Value).Count() > 0)
{
i++;
}
else { i = 0; }
if (i == s3.Length)
{
fl[k] = 1;
fl[k + 1] = 1;
fl[k + 2] = 1;
}
}
k = mapT2.Count(); i = 0;
//黄色输出
foreach (KeyValuePair<TextBox, string> key in mapT2)
{
k--;
if (fl[k] == 1)
{
key.Key.BackColor = Color.Yellow;
}
}
}
测试通过了,代码没有整理,直接把测试的代码发上来了,重复的代码很多。
我也是C#的初学者,对集合的用法理解不深。需要用标记法解决问题。
请教关于String.Where(s => s == key.Value).Count这样的表达式。具体是怎么解释的呢?