>

주석 처리되지 않은 코드를 .Select 와 같은 LINQ 메서드를 사용하는 코드로 다시 작성하는 데 문제가 있습니다. .Where  기본적으로 내가 제공 한 주석 비트와 같습니다.

String.Join(", ", ...) 사용에 대한 아이디어가있었습니다   StringBuilder 대신 .

private Dictionary<Int32, List<Ticket>> desks;
public void printTicketsByDesk(DateTime from, DateTime to) 
{
    for (int i = 0; i < numOfDesks; i++) 
    {
        StringBuilder sb = new StringBuilder();
        foreach (Ticket ticket in desks[i]) 
        {
            if (boughtBetween(ticket, from, to)) 
            {
                sb.AppendLine(ticket.ToString());
            }
        }
        Console.WriteLine(sb.ToString());
    }
    /*
    StringBuilder sb = new StringBuilder();
    Enumerable.Range(0, numOfDesks)
        .SelectMany(i => desks[i])
        .Where(ticket => boughtBetween(ticket, from, to))
        .Select(ticket => sb.AppendLine(ticket.ToString()));
    Console.WriteLine(sb.ToString());
    */
}

  • 답변 # 1

    LINQ는 주로 쿼리를위한 것입니다. ( "Q"는 Query를 나타냅니다) 그러나 컬렉션과 작동하기 때문에 foreach 대신에 그것을 사용하려는 경향이 있습니다  루프.

    이것은 List<T> 에 의해 합성됩니다  와이즈 비즈  실제로 LINQ는 아니지만 확장 기능이 있습니다.

    간단한 것을 반복하는 경우 LINQ를 전혀 사용할 필요가 없습니다. 원래 코드는 완벽하게 읽을 수 있습니다.

    LINQ를 사용할 때 .ForEach 를 만들기 위해 하나 이상의 컬렉션을 쿼리하기위한 것입니다.  반복 할 것입니다. 그러나 그럼에도 불구하고 읽기 쉬운 작은 조각으로 나누는 것이 좋습니다. 길고 복잡한 LINQ 쿼리를 작성하는 것이 멋지거나 보였기 때문에 유죄였습니다.

    나쁘지 않다 :

    IEnumerable
    
    

    그러나 헤어지는 것은 아프지 않습니다 :

    var tickets = desks.SelectMany(desk=>desk);
        .Where(ticket => boughtBetween(ticket, from, to));
    
    

    그런 다음 컬렉션을 정의한 후 일반 var tickets = desks.SelectMany(desk=>desk); var ticketsInDateRange = tickets.Where(ticket => boughtBetween(ticket, from, to)); 를 사용하여 컬렉션을 반복 할 수 있습니다.  루프 :

    foreach
    
    

    foreach (var ticket in ticketsInDateRange) { // append to stringbuilder or print } 에 줄을 추가 할 때 별 의미가 없습니다  선을 인쇄하려는 경우 당신은 단지 StringBuilder 수  한 번에 한 줄씩 와이즈 비즈  실제로 문자열을 작성해야하고 이전 문자열에 연결하여 새 문자열을 비효율적으로 생성하지 않으려는 경우에 유용합니다.

  • 답변 # 2

    모든 Console.Write 를 작성하려는 것 같습니다.  두 날짜 사이에 구매 한 품목 StringBuilder 의 샘플에서 명확하지 않습니다.  이 설정되어 있으므로 사전의 모든 항목 수라고 가정합니다.

    또한 Ticket 를 사용하고 싶다고 언급했습니다.   numDates 대신 .

    이 가정이 사실이라면 String.Join(", ", ...) 를 호출하여이를 수행 할 수 있습니다.  사전 값 ( StringBuilder )   SelectMany 로 표시되는 유형  아래), List<Ticket> 에 전달 될 때 true를 반환합니다.

    이 책을 읽기가 쉽지는 않지만 한 줄로 할 수 있습니다 :

    value
    
    

    대신에 별도의 줄에 출력하려면 BoughtBetween 를 대체하십시오.   public static void PrintTicketsByDesk(DateTime from, DateTime to) { Console.WriteLine(string.Join(", ", desks.Values.SelectMany(value => value.Where(ticket => BoughtBetween(ticket, from, to))))); } 와 함께 .

    <시간>

    완전성을 위해 다음은 관련 클래스 및 방법입니다.

    ", "
    
    

  • 답변 # 3

    목록/배열이 아닌 경우 왜 정렬되지 않은 사전입니까? 주문했다면 일이 훨씬 쉬워 질 것입니다. 사전이필요한경우 Environment.NewLine 사용을 고려하십시오.  대신에. (그러나 여전히 일련의 키 범위를 사용합니다 ...)

    각 책상의 내용을 출력하기 위해 별도의 전화를 거는 것을 고려할 때 한 번의 쿼리 로이 작업을 수행 할 수 없으므로 약간의 루프가 필요합니다.

    class Ticket
    {
        public DateTime PurchaseDate { get; set; }
        public override string ToString()
        {
            return PurchaseDate.ToShortDateString();
        }
    }
    public static bool BoughtBetween(Ticket ticket, DateTime from, DateTime to)
    {
        return ticket?.PurchaseDate >= from && ticket.PurchaseDate <= to;
    }
    
    

    SortedDictionary<,>

  • 이전 c - sqlite 및 fast math 사용시 gcc 오류 발생 - "sqlite는 gcc의 -ffast-math 옵션과 함께 올바르게 작동하지 않습니다"
  • 다음 image - JavaScript에서 createObjectURL 사용을위한 Blob 객체를 올바르게 작성하고 있습니까?