Группировать результаты linq по значению и группировать нулевые или недопустимые значения по пустой строке

Я пытаюсь сгруппировать по частичному почтовому индексу, и если какие-либо почтовые индексы имеют значение 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();

person Hank    schedule 28.07.2019    source источник


Ответы (1)


Я не думаю, что полностью понял, что вам нужно, но вот мое мнение:

Вы хотите сгруппировать по почтовому индексу, но если почтовый индекс имеет значение null или пуст или содержит менее 3 символов, вы хотите поместить их в группу "<null>".

Если это то, что вы хотите, вы можете попробовать что-то вроде следующего:

  var newset = (from rst in QBModel.ResultsTable
          group rst by GetGroupRepresentation(rst.CallerZipCode) into newGroup
          select new DataSourceRecord()
          {
            // ...
          }).ToList();

Со следующей реализацией для GetGroupRepresentation:

private string GetGroupRepresentation(string zipCode)
{
    if (string.IsNullOrEmpty(zipCode) || zipCode.Length < 3)
    {
        return "<null>";
    }

    return zipCode;
}

Я не понял, почему вы используете метод Substring или метод StartsWith, поэтому я просто удалил его.

Вот полный пример:

static void Main(string[] args)
{
    var zipcodes = new List<string> { "1234", "4321", null, "", "12" };

    // LINQ Query Syntax
    var groups = from code in zipcodes
                 group code by GetGroupRepresentation(code) into formattedCode
                 select formattedCode;

    // I think this is easier to read in LINQ Method Syntax.
    // var groups = zipcodes.GroupBy(code => GetGroupRepresentation(code));
}

private static string GetGroupRepresentation(string zipCode)
{
    if (string.IsNullOrEmpty(zipCode) || zipCode.Length < 3)
    {
        return "<null>";
    }

    return zipCode;
}

введите здесь описание изображения

person Thomas D.    schedule 28.07.2019
comment
Привет, Томас! Большое спасибо! Да, я забыл добавить этот бит, я использовал startwith, потому что обычно почтовый индекс имеет длину 6 символов, но я просто использую первые 3 для группировки и отчета. - person Hank; 28.07.2019
comment
Открыл дополнительный вопрос, если вам интересно: stackoverflow.com/questions/57247012/ - person Hank; 29.07.2019