Я пытаюсь сгруппировать по частичному почтовому индексу, и если какие-либо почтовые индексы имеют значение null или содержат менее 3 символов, сгруппируйте их как ""
Я видел пример использования компаратора с нулевым значением, но не уверен, как вписать что-то подобное в синтаксис в контексте ниже.
Также QBModel.ResultsTable — это динамический список, а CallerZipCode — это char (10), поэтому что-то с допустимым значением может быть «96701-----»
var newset = (from rst in QBModel.ResultsTable
group rst by rst.CallerZipCode.Substring(0, 3) into newGroup
select new DataSourceRecord()
{
State = ToTitleCase(newGroup.Select(i => i.CallerState).FirstOrDefault()),
ZipCode = newGroup.Where(z => z.CallerZipCode.StartsWith(newGroup.Key)).Select(x => x.CallerZipCode.Substring(0, 3)).FirstOrDefault()
}).ToList();
Вот компаратор с нулевым значением, который я нашел, но, вероятно, он нуждается в доработке, если я собираюсь проверить почтовые индексы менее чем на 2 символа:
public class NullableComparer<T> : IEqualityComparer<T?> where T : struct
{
public bool Equals(T? x, T? y)
{
if (x == null || y == null)
return false;
return x.Equals(y);
}
public int GetHashCode(T? obj)
{
return obj.GetHashCode();
}
}
Как я могу изменить этот код, чтобы выполнить то, что мне нужно?
[Редактировать]
Только что попробовал что-то вроде этого, но, похоже, это не очень хорошо работает
var newset = (from rst in QBModel.ResultsTable
group rst by rst.CallerZipCode == null || rst.CallerZipCode.Trim().Length() < 3 ? "<null>" : rst.CallerZipCode.Substring(0, 3) into newGroup
select new DataSourceRecord()
{
State = ToTitleCase(newGroup.Select(i => i.CallerState).FirstOrDefault()),
ZipCode = newGroup.Where(z => z.CallerZipCode.StartsWith(newGroup.Key)).Select(x => x.CallerZipCode.Substring(0, 3)).FirstOrDefault()
}).ToList();