C# 순차적 저장? 뭐라고 해야할지..!!

안녕하세요 ㅠㅠ

제글이 바로 밑에서 있어서 한동안 기다렸는데
새로운 글이 안올라오네요ㅠㅠ

바로 연이어 질문드리기가 민망해서… 흑…

염치불구하고 한참 방법을 찾다가 포기한 내용에 대해 조언을 얻고자 글 올립니다!

A폼

else if (e.Command == 20)
{
if (e.Argument2 == "단어")
{
this.BeginInvoke(new EventHandler(delegate (object s, EventArgs ee)
{ 
name1 = e.Argument1;
TransferForm_Info();
}));                    
}
}

B폼

받았습니다Regex = new Regex(timeStampRegex + "(로그! )?((?<server>.+)[이가] )?((?<ip>.+)에게서 |(?<send>.+)의 효과로 )(?<log>[^a-zA-Z]+)의 내용을 받았습니다", RegexOptions.Compiled);
 matches = 받았습니다Regex.Matches(line);

if (matches.Count > 0)
{
DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
String server= matches[0].Groups["server"].Value;
String send= matches[0].Groups["send"].Value;
int damage = matches[0].Groups["log"].Value.GetDigits();
String from = matches[0].Groups["ip"].Value;

InstanceEvent(this, new InstanceEventArgs(line, time, 20, server, ip));
}

로그 파일은 실시간으로 수십수백줄씩 계속 log파일에 쓰이고 있습니다.
새롭게 생성되는 줄에서 “단어”(ip)가 발견될 경우 "server"를 화면에 띄우는 코드를 만들고있습니다
오버레이로요… (이게 중요한게 아니고…!! ^^;:wink:

확실한건 최~소 텀이 30초에서 1분은 넘기 때문에 한번 화면에 표기하면 계속 떠있거든요.
근데 문제는 초까지 동일한 시간에 1-4개의 IP가 뜹니다.

A폼의 구문으로는 만약에 동일한 시간에 3개의 IP가 로그에 적히면
화면에 다 띄우긴 하겠지만 1번 2번 3번을 띄워서
1번 2번은 휙 지나가버린다는거죠!

제가 원하는 방법은 지연이 아니고, 동시에 화면에 그 3개를 띄우고 싶습니다!

해외포럼을 뒤져봤을때
prev2 = prev1
prev1 = line
뭐이렇게 해서 이전라인을 변수에 담아놔라… 라는거 같은데
제 상황에서는 너무 1차원적이어서 적용하기가 어렵고…
비슷한 개념으로 혹시 좋은 방법이 있다면 조언 부탁드립니다 ㅠㅠ

동일한 초에 1-4개가 뜹니다!!

B폼에 있는 (line, time, 20, server, ip) 중에 time을 예로해서
같은 초에 뜨는 라인에 3개가 있다면 3개를 각각 스트링에 담아서 보낸다
이런거면 좋겠는데… 머리로는 알겟는데 구현을 못합니다…ㅠ_ㅠ_ㅠ_ㅠ_ㅠ

살려주십시요… 감사합니다!

1개의 좋아요

UI 표현방법에 대해 헤매고 계신것 같습니다.
'휙 지나가버린다’라고 하신걸보니 여러이벤트에 대한 데이터는 정상적으로 처리되어 이벤트함수를 호출하고 있는 것 같구요.
마지막 로그만 UI에 표시될 수있는 이유는 정말 많아서 질문해주신 내용만 가지고는 답변을 드리기가 살짝 애매합니다.
그래도 초보입장에서 실수할만한 요소로 의심되는건
'로그표시 UI가 정적으로 1개만 만들어진상태로 재사용하고있어서 최신데이터로 계속 갱신되는 상황’이네요.
이 글을보고 이해하기가 어려우시다면 객체의 메모리 할당과 해제, 자료구조 큐,스택에 대한 공부를 하신 후 다시 돌아오면 문제를 전보다 쉽게 해결 하실 수 있을 거라고 생각됩니다. 화이팅입니다

3개의 좋아요

안녕하세요!! 답글 감사합니다.

예를들어서
1분 1초 A C
1분 1초 A D
1분 1초 A F
1분 5초 A S

이렇게 라인이 서로 다른데 같은 시간에 뜬 3개중에 C도 뜨고 D도 뜨고 F도 뜹니다
근데 같은 시간이라 화면엔 F만 남게 되고
4초후엔 S도 잘 뜨구요.

현재는 1개만 전달하게 되어있는 상태인데,
최대 4개까지 변수(?)를 만들어서 저장하게하고 4개를 모두 보낼수 있는 구문(?)을
못찾고 있어서요…

실시간으로 동시에 전달이 되어야 해서요…ㅠ_ㅠ
현재 다른 문제는 없는데 같은 초에 값이 다른 3개가 뜨면
앞에 2개는 너무 순식간에 지나가버려서 그 값을 그냥 각각 변수(?)에 담아서
보내는 방법을 찾고 있습니다…!!

제가 물음표를 쓰는건 맞는 단어인지 확신이 없어서ㅠ_ㅠ

================================================

다시한번 남겨주신글을 정독하니…

로그 표시 UI가 정적으로 1개만 만들어진 상태로 재사용하고 있다!
이거 정확한거 같습니다.
아… 음… 맞습니다.
오버레이로 창을 만들어서 띄우는데
오… 그럼 이 오버레이 창을 4개를 만들어놓고 위치를 조절해서…
A는 A창에 B는 B창에…
그러면 A랑 B는 구분을 어떻게 할까요… 음…
같은 초에 온 3개를 구분해야하는건 여전한 문제같은데…
if문으로 첫번째행과 두번째 행을 비교하려고 해도
결국엔 분리를 해야하지 않나 싶은데… 일단 계속 저도 머리를 굴려보겠습니다!!

================================================
찾고자 하는 단어의 값은 "1"이다

"1"을 A에 담는다.

A의 값은 A로 보낸다…

그런데 같은 시간에 "1"의 값이 또 나왔다.

이 "1"의 값을 B에 담고 싶습니다.

이 방법을 모르겠습니다…

================================================
아 잠시만요…

10의 값이 들어간 라인에서 1을 찾는다. 이죠.

이 1을 A에 담고,

같은시간에!

10의 값이 들어간 라인에서 2를 찾는거에요.

근데 이 1과 2가 고정값이 아니군요…

자…

1을 A에 담고, (시간을 같이 담고)

같은 시간에 10의 값이 없으면

A를 A에 보내고

같은 시간에 10의 값이 있고 2를 찾으면

2를 B에 담고

A와 B를 비교해서 같은 값이면

A를 A로 보낸다.

다른 값이면

A를 A로 B를 B로 보낸다

이게 말이 되는건가… 한번 해보겠습니다. 이건 할수있을것같습니다…

================================================
문제는 계속 같은데,
동시에 뜨는 3개의 라인을 서로 비교하려면
이전 라인을 저장해야하는데 그게 안되는 상황이네요…

2개의 좋아요

원하시는 화면 표현을 간단하게 도식으로 표현해주시면 답변하는데 도움이 될 듯 합니다.

저의 짧은 생각으로는 동시 표시하는 영역이 4개 (또는 그 이상) 이고 동시에 4개를 표시해야 할 때 그 4개 영역을 사용하면 될 것이고, 3개면 3개 영역에다만 표시하면 될 듯 하는데요?

3개의 좋아요

질문은 언제나 올리셔도 됩니다.

그런데, 지난 번 글과 마찬가지로 질문에 요지가 명확하게 표현되지 않은 것 같습니다.

보다 정확하고 올바른 답변을 받으시려면,

  1. 닷넷은 프레임워크가 다양하기 때문에, 서두에 사용 중인 프레임워크와 닷넷 버전을 명기하는 게 좋습니다.
    제일 좋은 건 .csproj 의 내용을 보여 주시는 것입니다.

  2. 코드의 동작 과정을 말로 기술하는 것보다, 코드 자체를 많이 보여 주시는 게 좋습니다.
    코드는 최대한 가독성이 좋게 꾸며 주셔야 읽으시는 분들이 문제를 빠르게 캐치할 수 있습니다.

  3. 자신의 코드에 자신이 없다면, 데이터 소스의 형태와 원하는 동작만 나열하시는 게 좋습니다.
    개인 마다 문제 해결 과정과 방식이 다릅니다. 아예 제로 상태에서 물어 보는 것도 경험 많은 개발자에게 배우는 기회가 됩니다.

답답한 마음은 충분히 이해하지만, 조금만 차분히 정리해서 질문해주시면 좋겠습니다.

5개의 좋아요

오… 안녕하세요!!

간단하고 쉽게 정리를 해보겠습니다!

log 파일은 계속 바뀌고 500밀리초단위로 "라인"을 읽어옵니다.
지나간 라인은 못읽어요! (읽게 해도 의미가 없는 상황이에요)

같은시간 1번라인 11 A
같은시간 2번라인 11 A
같은시간 3번라인 11 A
다른시간 4번라인 22 A
다른시간 5번라인 11 A

A를 다른폼에 동시에 띄워야해요.
A값은 서로 다르고 예측할 수 없는 값이고
11을 기준으로 해당 라인을 찾아요.

다른시간 5번라인은 하나만 뜨는 경우라 문제 없어요!

현재 코드는
A의 값을 string name1 에 담아서 다른 폼으로 보내요.
실시간으로 계속 보내는거죠.
그러니까 같은시간에 3줄이 뜨면 3줄을 다 보내는데 1~2줄은 너무 빨리 없어져서
3번째줄만 표기가 되는 상황이에요.
이걸 위에 분이 말씀해주신대로 폼을 3개만든다고 쳐도,
11의 기준으로 값을 찾는거니 A를 1번폼으로 보내고 A를 2번폼으로보내고 A를 3번폼으로 보내면
결국엔 똑같은 내용이 반짝이는것과 다를바 없네요ㅠㅠ

제가 원하는건
같은 시간 라인이 여러줄일때, 각 A A A를
name1 name2 name3 에 담아서 다른 폼으로 한번에 보내는거에요!

제 머리에서는 이전의 줄 4개정도를 변수에 담는 방식을 이용해서 비교하는것밖에
없는 것같은데… 이방법을 모르겠어요…
담을 수만 있다면, 그 라인끼리 비교만 하면 끝나는데…
설명이 잘 전달이 됐을가 모르겠네요ㅠㅠ

==========================================================
사용중인 프레임워크 라는 뜻을 정확히 이해하지 못해서
현재 닷넷 프레임워크 4.8 기반입니다 (라고 말해도 되는거죠…?)

윈폼이고 단일파일이긴 한데 cs 파일이 200여개가 넘고…
각각 막 저도 뭐가 뭔지 이해를 못하는 부분이 많아서
최대한 관련있어 보이는 구문을 참고삼아 올리긴했습니다.
자잘한건 짜르구요…

==========================================================

else if (e.Command == 20)
{
if (e.Argument2 == "단어")
{
this.BeginInvoke(new EventHandler(delegate (object s, EventArgs ee)
{  //라인의 구조는 line / time / e.Argument2 /  e.Argument1 / 로 이루어져있다고 보셔도됩니다!
name1 = e.Argument1;
TransferForm_Info();
}));                    
}
}

잘 설명이 됐나 모르겠습니다…ㅠ_ㅠ…

2개의 좋아요

훨씬 내용 파악이 쉬워졌습니다. 엄지척

여러 구현 방식이 있을 것 같아요.

첫번째 방식은 동일 시각의 A1, A2, A3를 동시에 폼에 전달해서 11번 라인에 3개를 동시에 표현하는 방식이 있겠고,

두번째 방식은 (시각, 라인, A값)을 폼에 전달해서

기존 표시된 값이 동일 시각일 경우 해당 라인에 더해져 표시하는 것이죠.

저는 두번째 방식이 구현도 쉽고 전달하는 쪽(로그 확인)과 표현하는 쪽(폼)의 기능이 더 잘 분리된다고 생각합니다.

정리

  1. 오버레이 폼에 (시각, 라인, A값)을 전달한다.
  2. 오버레이 폼에는
    2.1. 기존 해당 라인의 시각이 동일할 경우 누적해서 새로운 값을 더해 표시한다.
    2.2. 기존 해당 라인의 시각이 다를 경우 기존 값을 지우고 새로운 값을 표시한다.
3개의 좋아요

당장 정리해보겠습니다!!!

두번째 방법!!

1개의 좋아요

제가 보기에는 name1 이 string 형식이라면, 간단한 문제 같습니다.

이벤트 핸들러로 문자열을 버퍼에 저장하고 있다가,
화면만 일정 시간 주기로 갱신해서 보여주면 되는 것 아닌가요?

private System.Text.StringBuilder _sb = new(); // string 버퍼.
private System.Timers.Timer _timer = new(500); // 500 ms 마다 이벤트 발생 => 500 ms 주기로 폼 데이터 갱신.

//생성자
{
    _timer.Elapsed += UpdateForm;
    _timer.AutoReset = true;
    _timer.Enabled = true;
}

private void UpdateForm(object s, ElapsedEventArgs e)
{
    if(_sb.Length > 0)
    {
        name1 = _sb.ToString();
        _sb.Clear();
       TransferForm_Info();
    }
}

//...

this.BeginInvoke(new EventHandler(delegate (object s, EventArgs ee)
{
     _sb.AppendLine(ee.Argument1);
}));
1개의 좋아요
  1. 오버레이 폼에 (시각, 라인, A값)을 전달한다.

  2. 오버레이 폼에는
    2.1. 기존 해당 라인의 시각이 동일할 경우 누적해서 새로운 값을 더해 표시한다.
    2.2. 기존 해당 라인의 시각이 다를 경우 기존 값을 지우고 새로운 값을 표시한다.

  3. 오버레이폼에 값을 전달한다는 아무 문제가 없습니다!!

그런데…

오버레이폼에서 첫번째로 받은 값과

두번째로 받은 값을 어떻게 구분하고 저장하지요…

오버레이 폼에 퍼블릭 스트링 A를 만들어 두어서
그 A로 값을 보냈고!

(이하뻘짓)
var aa = A; (혹은 string)
var bb = aa;

이런식으로 이렇게도 저렇게도 해봤는데 이게 잘 안되는데 조금만 더 알려주실수있을가요…ㅠ_ㅠ

1개의 좋아요

이런방법이…? 일단 정독하고 적용해보겠습니다

====================
동일한 시간에 뜬 로그라면 동일한 화면에 동시에 띄우는게 목적이라
일단 스트링빌더에 저장을하고 그걸로 비교를 해도 되는거겟지요…?

대상으로 형식화된 개체만들기는 C# 7.3에서 사용할수 없습니다…ㅠ_ㅠ 라네요!
아마도 닷넷 코어인가 부터 되는거같습니당
그래도 뭔가 방법을 제시해주셔서 스트링 빌더를 한번 파보겠습니당…!!!

====================

제가 생각하는건
현재 상태 마지막줄에 있는 값을 스트링 빌더에 보내고
앞으로 새로 생긴 값을 A에 저장해서
A와 스트링빌더에 있는 값을 비교하는게 가능한지인데, 삽질일가요…? 일단 해보는중이긴합니당

2개의 좋아요

원하시는 대로 구현하면 되죠.

한 화면에 여러 개 항목을 띄우기를 원한다면, List<string> 에 저장해 놓고, 이 리스트에 담겨진 문자열을 화면에 보여줄 목록뷰를 정의하고 바인딩 시키면 됩니다.

그때는 아래와 같이 순서가 변경되어야 겠지요.

private List<string> _buffer = new();  // 버퍼
private List<string> _names = new(); // 바인딩 대상.

private void UpdateForm(object s, ElapsedEventArgs e)
{
    if(_buffer.Count > 0)
    {
       _names.Clear();
        _names.AddRange(_buffer);
        _buffer.Clear();
       TransferForm_Info();
    }

//...

this.BeginInvoke(new EventHandler(delegate (object s, EventArgs ee)
{
     _buffer.Add(ee.Argument1);
}));
3개의 좋아요

오우… 일단 선 댓글 후
정독하고 해보겠습니다

뭔가 느낌이 왔네요!! _buffer 라는 글씨가 참 예쁘네요ㅠㅠ

================================
일단 이것도 버전이 안맞아서 그대로는 못쓰겠지만
버퍼(?)쪽으로 뭔가… 찾아보겠습니다!

A를 사용하고, 그 값을 버퍼로 보내고
새로운 A를 가져오면 버퍼랑 비교하고 다르면 추가하고…
이런형태로 한번 각을 잡아보겠습니다…

3개의 좋아요

윈도우용 닷넷의 비애이지요. ^^

아마 생성자 호출 문법에서 에러가 났을 것입니다. 형식을 생략하지 않고 넣어 주면 해결됩니다.

new() => new List<string>()

3개의 좋아요

private List _buffer = new List(); // 버퍼
private List _names = new List(); // 바인딩 대상.

오 이렇게요 그럼 위엣것도 비슷하겟네요

일단 이것저것 다 해보겠습니다!!

=================================
일단 됩니다 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ
일단 되구요

private List<string> namebuffer1 = new List<string>();  // 버퍼
private List<string> namebuffer1_1 = new List<string>(); // 바인딩 대상.

이런상태에서

public async void logParser_chatCommandEvent2()
{
if (namebuffer1.Count > 0) <-- namebuffer1에 값이 온다면
{
namebuffer1_1.Clear(); <-- 기존 namebuffer1_1 값 초기화
namebuffer1_1.AddRange(namebuffer1); <-- namebuffer1_1에다가 namebuffer1값 추가
namebuffer1.Clear(); <--namebuffer1 기존 값 초기화
}
namebuffer1.Add(name); 
<-- 새로 온 네임값을 namebuffer1 에 추가(이거 순서를 모르겠음 아마도 제일 먼저?)

string joinedNames = String.Join(", ", namebuffer1.ToArray()); <-- 비교와 표시를 위한 스트링화
string joinedNames2 = String.Join(", ", namebuffer1_1.ToArray()); <--비교와 표시를 위한 스트링화

(DrawString(joinedNames); <--화면에표기 (간략하게 표기함)

if (joinedNames != joinedNames2) <--namebuffer1 값과 namebuffer1_1값이 다르면
{
logParser_chatCommandEvent3(); <-- 새로운오버레이 열기
}
}
public void logParser_chatCommandEvent3()
        {
            string joinedNames = String.Join(", ", namebuffer1.ToArray());
            string joinedNames2 = String.Join(", ", namebuffer1_1.ToArray());

            g.DrawString(joinedNames + "\n" + joinedNames2);
        }

이게 다는 아니지만
이제

private List<string> namebuffer1 = new List<string>();  // 버퍼
private List<string> namebuffer1_1 = new List<string>(); // 바인딩 대상.

이걸 이름을 바꿔가면서 여러번 써서
시간으로 8개 표기할이름 8개 (받아오는거 4개 넘겨주는거 4개씩)

private List<string> 이름1= new List<string>(); 
private List<string> 이름1_1= new List<string>();
private List<string> 이름2= new List<string>(); 
private List<string> 이름2_1= new List<string>();
private List<string> 이름3= new List<string>(); 
private List<string> 이름3_1= new List<string>();
private List<string> 이름4= new List<string>(); 
private List<string> 이름4_1= new List<string>();
private List<string> 시간1= new List<string>(); 
private List<string> 시간1_1= new List<string>();
private List<string> 시간2= new List<string>(); 
private List<string> 시간2_1= new List<string>();
private List<string> 시간3= new List<string>(); 
private List<string> 시간3_1= new List<string>();
private List<string> 시간4= new List<string>(); 
private List<string> 시간4_1= new List<string>();

{
시간 1 2 3 4 모두 같으면 (if 
  {
  이름 1 2 3 4 값이 모두 같지 않으면
    {
    이름 1,2,3,4를 동시에 띄우고
      {
      이름 1 2 3 값이 모두 같지 않으면
        { 
        이름 1,2,3을 동시에 띄우고
          {
          이름 1 2 서로 **다르면**
           {
           이름 1,2를 동시에 띄운다
             {
{
시간 1 2 3서로 **같으면**
  {
  이름 1 2 3 서로 **다르면**
    {
    이름 1,2,3을 동시에 띄우고
      {
      이름 1 2 서로 **다르면**
        {
        이름 1,2를 동시에 띄운다

시간1과 2와 3이 서로 같으면
이름1과 2와 3이 서로 다르면
이름 1,2,3,4를 동시에 띄우고

잠시만요 머리가 아파서 정리 좀 다시 하고… 이게 아닌거같아서요…

일단 작동은 확실히 되요!

2개를 비교하는게 가능한데

경우의 수가 많아서 머리가…

너무 초보에게 친절하게 알려주셔서 감사합니다.

모든 코드를 작동이 되게 만들고 나서 정리를 해보도록 하겠습니다.

4개의 좋아요

작성자가 원하는 것!!

실시간으로 1초에도 여러줄이 계속 생성되는 로그파일에서
초단위까지 동일한 시간을 기준으로 원하는 단어를 저장해서
동일하게 화면에 오버레이로 띄우고 싶다!
보통 한줄을 띄우고 다음줄을 띄우는게 일반적인데
지나간 줄을 저장해두고 비교한 후 띄우는게 목표!

해결방법!!

else if (e.Command == 20) 
{
if (checkBox2.Checked == true && e.Argument2 == "조건")
{
this.BeginInvoke(new EventHandler(delegate (object s, EventArgs ee)
{
string myTime = e.time.ToString("yyyy/MM/dd hh:mm:ss"); //시간을 스트링타입으로

name1 = e.Argument1; //보내는쪽에서는 딱히 할게 없다.
time1 = myTime; 

TransferForm_Info();
}));
}

받는쪽!!

private List<string> namebuffer1 = new List<string>(); 
private List<string> namebuffer2 = new List<string>(); 
private List<string> namebuffer3 = new List<string>(); 
private List<string> namebuffer4 = new List<string>(); 
private List<string> namebuffer5 = new List<string>(); 
private List<string> timebuffer1 = new List<string>(); 
private List<string> timebuffer2 = new List<string>();
private List<string> timebuffer3 = new List<string>();
private List<string> timebuffer4 = new List<string>();
private List<string> timebuffer5 = new List<string>();

4개를 띄울건데 5개는 해놔야 뭔가 잘 되는것 같습니다…
정확하게 테스트는 못해봤는데 일단 저렇게 선언(?) 해두고!

public void buffer()
{
if (namebuffer1.Count > 0) //네임버퍼에 뭔가 들어오면
{
namebuffer5.Clear(); //5를비우고 
namebuffer5.AddRange(namebuffer4); //5에 4를 넣고?
namebuffer4.Clear();//이걸 왜 2개를 해놨는지 모르겠는데 이렇게해야 잘되더라구요....?
namebuffer4.Clear();
namebuffer4.AddRange(namebuffer3);
namebuffer3.Clear();
namebuffer3.Clear();
namebuffer3.AddRange(namebuffer2);
namebuffer2.Clear();
namebuffer2.Clear();
namebuffer2.AddRange(namebuffer1);
namebuffer1.Clear();
}
if (timebuffer1.Count > 0)
{
timebuffer5.Clear();
timebuffer5.AddRange(timebuffer4);
timebuffer4.Clear();
timebuffer4.Clear();
timebuffer4.AddRange(timebuffer3);
timebuffer3.Clear();
timebuffer3.Clear();
timebuffer3.AddRange(timebuffer2);
timebuffer2.Clear();
timebuffer2.Clear();
timebuffer2.AddRange(timebuffer1);
timebuffer1.Clear();
}
namebuffer1.Add(name);//보낸쪽의 name을 namebuffer1에 먼저 넣어두는것 같습니다.
timebuffer1.Add(time);
}

저렇게 해서 하나가 들어오면 결국엔 하나씩 밀려서 저장이 되는것 같습니다.

string joinedNames1 = String.Join(", ", namebuffer1.ToArray());
string joinedNames2 = String.Join(", ", namebuffer2.ToArray());
string joinedNames3 = String.Join(", ", namebuffer3.ToArray());
string joinedNames4 = String.Join(", ", namebuffer4.ToArray());
string joinedTimes1 = String.Join(", ", timebuffer1.ToArray());
string joinedTimes2 = String.Join(", ", timebuffer2.ToArray());
string joinedTimes3 = String.Join(", ", timebuffer3.ToArray());
string joinedTimes4 = String.Join(", ", timebuffer4.ToArray());

스트링으로 변환을 해서

if (joinedTimes1 == joinedTimes2 && joinedTimes2 == joinedTimes3 && joinedTimes3 == joinedTimes4)
//타임이 1번과2번, 2번과3번, 3번과4번이 같으면 (한줄씩 올라오기때문에 1,3번이 혹은 1,4번이 같으면 이란 조건은 의미가 없을것 같더군요)
{
g.DrawString(joinedNames1 + "\n" + joinedNames2 + "\n" + joinedNames3 + "\n" + joinedNames4,
//텍스트 1234를 뿌린다
new Font(FontLibrary.Families[0], 30, FontStyle.Regular), Brushes.White,
ClientRectangle, stringFormat);
SelectBitmap(image, 500);
}
if (joinedTimes1 == joinedTimes2 && joinedTimes2 == joinedTimes3 && joinedTimes3 != joinedTimes4)
//시간이 1번과 2번이 같고 2번과 3번이 같은데 3번과 4번은 다르다면(123번만같다면!)
{
g.DrawString(joinedNames1 + "\n" + joinedNames2 + "\n" + joinedNames3,
//123번만 뿌린다
new Font(FontLibrary.Families[0], 30, FontStyle.Regular), Brushes.White,
ClientRectangle, stringFormat);
SelectBitmap(image, 500);
}
if (joinedTimes1 == joinedTimes2 && joinedTimes2 != joinedTimes3)
//1번과 2번이 같고 2번과 3번이 다르다면
{
g.DrawString(joinedNames1 + "\n" + joinedNames2,
new Font(FontLibrary.Families[0], 30, FontStyle.Regular), Brushes.White,
ClientRectangle, stringFormat);
SelectBitmap(image, 500);
}
if (joinedTimes1 != joinedTimes2)
{
g.DrawString(joinedNames1,
new Font(FontLibrary.Families[0], 30, FontStyle.Regular), Brushes.White,
ClientRectangle, stringFormat);
SelectBitmap(image, 500);
}
int millisecondsDelay = 1500;
if (joinedNames1 != null)
//여기서 좀 고민했는데 null이라고 할지 Empty라고할지.. 둘다해봤는데 이게 잘 되서..
//값이 없으면 1.5초후에 빈화면을 띄우게 해봤습니다.
{
await Task.Delay(millisecondsDelay);
logParser_chatCommandEvent4();
}

빅스퀘어님이 간단한거같다고 하셨지만…
마치 참 쉽죠? 같은 느낌으로 얘기하셨지만…
머리가 뽀개지는줄알았습니다…

결국엔 이해는 하지않기로 하고 일단 작동이 잘 되기에…

거듭 감사드립니다 여러분!! 고맙습니다!!

1개의 좋아요

사실 원하시는 게 정확히 뭔지 파악이 안 돼서, "버퍼로 처리할 수 있다"는 점만 알려 드린 것 뿐입니다.

그러나, 보통 문자열에 대한 처리가 필요하다면 이를 위한 객체를 별도의 파일에 정의해서 관리하는 게 좋습니다. 의도를 제 나름으로 해석한다면, 아래와 같은 객체를 정의했을 것 같습니다.

(실행은 안 해본 코드입니다. 필요하시다면 이해만 하시고 적절히 수정하시는게 좋습니다.)

class LogHandler
{
    public Task<string[]> HandleAsync(string allLogs)
    => Task.Run(() => Handle(allLogs));

    private string[] Handle(string allLogs)
    {
        var splitLogs = Split(allLogs);
        var dic = new Dictionary<(string Time, string Name), string>();
        foreach(var log in splitLogs)
        {
           var parsed = Resolve(log);

           if(dic.ContainsKey( (parsed.Time, parsed.Name) ), out string message))
           {
               dic[(parsed.Time, parsed.Name)] = message + ", " + parsed.Message; 
               continue;      
           }

           dic[(parsed.Time, parsed.Name)] =  parsed.Message; 
        }

        return dic.Select(dic => $"{dic.Key.Time}:{dic.Key.Name} Message: {dic.Value} ")
                  .ToArray();
    }
    
    private string[] Split(string allLogs)
    {
          // 모아 둔 로그를 줄 단위로 끊어 배열에 저장.
    }

    private (string Time, string Name, string Message) Resolve(string log)
    {
         // 로그에서 시간, 이름, 메시지를 구분하여
        string time = ....
        string name = ...
        string message = ...

        return ( time, name, message);
    }     
}
1개의 좋아요

어지럽네요…ㅎㅎㅎㅎㅎ…
일단 메모해놨습니다!
실력이 향상되고 좀 더 완벽한 정리가 필요할때 건드려보겠습니다!!
초보에겐 아주 작은 힌트 하나도 굉장히 도움이 됩니다!!
감사해요 ㅎㅎ