Есть несколько вещей, которые можно сделать, чтобы исправить это поведение. Для начала перейдите к своему решению и «Добавить» -> «Новый проект» -> «Тест» -> «Проект тестирования модулей». Это Vs2012, а в Vs2010 меню будут немного отличаться.
После инициализации тестового проекта сделайте «Добавить» -> «Новый элемент» -> «Класс». Затем вставьте следующий код в этот класс ...
[TestClass]
public class MyQueryUnitTests
{
[TestMethod]
public void TestMethod1()
{
BitQuery bitQuery = new BitQuery();
var result = bitQuery.Query("ADDR");
Assert.IsTrue(result.Count==3);
}
[TestMethod]
public void TestMethod2()
{
BitQuery bitQuery = new BitQuery();
var result = bitQuery.Query("XXX");
Assert.IsTrue(result.Count == 2);
}
[TestMethod]
public void TestMethod3()
{
BitQuery bitQuery = new BitQuery();
var result = bitQuery.Query("CMS");
Assert.IsTrue(result.Count==1);
}
[TestMethod]
public void TestMethod4()
{
BitQuery bitQuery = new BitQuery();
var result = bitQuery.Query("CMSR");
Assert.IsTrue(result.Count == 1);
}
[TestMethod]
public void TestMethod5()
{
BitQuery bitQuery = new BitQuery();
var result = bitQuery.Query("CM");
Assert.IsTrue(result.Count == 2);
}
[TestMethod]
public void TestMethod6()
{
BitQuery bitQuery = new BitQuery();
var result = bitQuery.Query("DUMMY");
Assert.IsTrue(result.Count == 2);
}
[TestMethod]
public void TestMethod7()
{
BitQuery bitQuery = new BitQuery();
var result = bitQuery.Query("");
Assert.IsTrue(result.Count == 5);
}
}
public class BitQuery
{
public ObservableCollection<bit> bitfields = new ObservableCollection<bit>();
public BitQuery()
{
bitfields.Add(new bit { name_ = "CMSRC_XXX_ADDR" });
bitfields.Add(new bit { name_ = "CMDST_XXX_ADDR" });
bitfields.Add(new bit { name_ = "TXDAT_DMA_ST_ADDR" });
bitfields.Add(new bit { name_ = "WWWW_DUMMY" });
bitfields.Add(new bit { name_ = "ABCDE_DUMMY" });
}
public List<bit> Query (string text)
{
string txtOrig = text;
string lower = txtOrig.ToLower();
string normalize = txtOrig.Normalize();
var bitfieldsfiltered = from bit in bitfields
let name = bit.name_
where IsMatch(txtOrig, name)
select bit;
return bitfieldsfiltered.ToList();
}
private bool IsMatch(string txtOrig, string name)
{
if (name.StartsWith(txtOrig, StringComparison.InvariantCultureIgnoreCase)) return true;
if (name.IndexOf(txtOrig, 0, StringComparison.OrdinalIgnoreCase) >= 0) return true;
return false;
}
}
public class bit
{
public string name_ { get; set; }
public override string ToString()
{
return name_;
}
}
И затем сообщите Visual Studio, чтобы запустить модульные тесты. VS откроет окно, которое подсвечивается различными цветами и запускает тесты.
Все тесты показывают, что проблема, о которой вы описали, исправлена, и вы возвращаете ожидаемые результаты!
непосредственный интерес является замена ваших длительных «или» статей с простым методом ...
private bool IsMatch(string txtOrig, string name)
{
if (name.StartsWith(txtOrig, StringComparison.InvariantCultureIgnoreCase)) return true;
if (name.IndexOf(txtOrig, 0, StringComparison.OrdinalIgnoreCase) >= 0) return true;
return false;
}
--- который делает по существу то же самое. ПРИМЕЧАНИЕ. Вам нужно будет добавить еще несколько модульных тестов, чтобы охватить все различные условия. Если у вас очень высокий уровень уверенности в том, что ваш запрос является надежным и неизменно точным, вы можете подключить его обратно к своему списку.
Другое изменение стоит брать на борт эта линия ...
return bitfieldsfiltered.ToList();
Это принимает результат LINQ и «запирает его вниз». В исходном коде вы оставили его как неоплаченный запрос (который может или не может повлиять на этот конкретный случай, но всегда полезно заблокировать его, если вы представляете что-то на поверхности пользователя).
Итак, ваши запросы «CMS» и «CMSR» работают сейчас, и у вас есть некоторые модульные тесты, где вы можете ввести дополнительные условия и быть уверенными в том, что все это работает.
Wow! Почему вы не используете одно из перечислений StringComparison? Он может упростить вашу логику примерно на 66% и облегчить ее отладку. Просто любопытно? –
@GarryVass, потому что он может не знать о таком перечислении. –
@ user2591237, если вы перепробируете свой вопрос, чтобы включить, что вы счастливы принять улучшения логики/эффективности? –