c#2017.08.01 12:14

소켓통신으로 사진을 받는데 소켓호출을 동시에 여러번하면 중구난방으로 되어서


파일 하나를 다운받으면 그 다음 파일을 다운받는 형식으로 바꾸었다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    /// <summary>
    /// 포토 파일을 받을때 비동기로 처리 하기때문에 큐에 넣어서 다운이 다 받아지면 그떄 다음파일을 다운받도록 도와주는 클래스
    /// 받을파일을 한꺼번에 저장해놓고 차례대로 다운된다.
    /// </summary>
    public static class QueueManager
    {
        private static List<Action> queue = new List<Action>();
 
        public static void Add(PhotoData pd)
        {
            queue.Add(() => { Managers.DataManager<PhotoData>.GetFProcessPhoto(pd); });
        }
 
        public static void Excute()
        {
            if (queue.Count == 0)
                return;
 
            queue[0]();
            queue.RemoveAt(0);
        }
    }



Action을 이용해서 List에 소켓통신호출을 하고 리시브 받았을때 excute를 실행해서


큐에서 차례대로 파일이 전송되게 구현하였다.


Posted by 동동(이재동)
c#2017.07.26 18:57

이전데이터와 새로 받아온 데이터를 비교해서 UI를 Update할지 말지 비교할때 사용한 Class 이다

일단 이전 데이터를 백업 해놓고

1
2
//데이터 비교를 위해서 저장
_previousOrderData = new List<OrderKey>(orderKey);

새로운 데이터를 받으면 비교해서 같은지 다른지 판단해준다.


1
var isEqual = ListDiffManager.CompareList(orderKey, _previousOrderData);


이걸 가능하게 해준 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public static class ListDiffManager
    {
        public static bool CompareList<T>(this List<T> list1, List<T> list2)
        {
            //if any of the list is null, return false
            if ((list1 == null && list2 != null) || (list2 == null && list1 != null))
                return false;
            //if both lists are null, return true, since its same
            else if (list1 == null && list2 == null)
                return true;
            //if count don't match between 2 lists, then return false
            if (list1.Count != list2.Count)
                return false;
            bool IsEqual = true;
            foreach (T item in list1)
            {
                T Object1 = item;
                T Object2 = list2.ElementAt(list1.IndexOf(item));
                Type type = typeof(T);
                //if any of the object inside list is null and other list has some value for the same object  then return false
                if ((Object1 == null && Object2 != null) || (Object2 == null && Object1 != null))
                {
                    IsEqual = false;
                    break;
                }
 
                foreach (System.Reflection.PropertyInfo property in type.GetProperties())
                {
                    if (property.Name != "ExtensionData")
                    {
                        string Object1Value = string.Empty;
                        string Object2Value = string.Empty;
                        if (type.GetProperty(property.Name).GetValue(Object1, null) != null)
                            Object1Value = type.GetProperty(property.Name).GetValue(Object1, null).ToString();
                        if (type.GetProperty(property.Name).GetValue(Object2, null) != null)
                            Object2Value = type.GetProperty(property.Name).GetValue(Object2, null).ToString();
                        //if any of the property value inside an object in the list didnt match, return false
                        if (Object1Value.Trim() != Object2Value.Trim())
                        {
                            IsEqual = false;
                            break;
                        }
                    }
                }
            }
            //if all the properties are same then return true
            return IsEqual;
        }
    }

출처 : http://answers.unity3d.com/questions/1307074/how-do-i-compare-two-lists-for-equality-not-caring.html

Posted by 동동(이재동)
wpf2017.07.25 17:41

List는 List<ConvertOrderKey>이런식으로 자료가 들어가 있고


ItemTemplate안에는 

<Button Content="주문확인" Width="70" Command="{Binding ElementName=xListView, Path = DataContext.OrderClickCommand}" CommandParameter="{Binding}" />


이런식으로 구현하였다.

커맨드 파라미터는 그냥 ConvertOrderKey모델 전체를 넘겼다.


viewModel에서는


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 private RelayCommand<ConvertOrderKey> _orderClickCommand;
 
        public RelayCommand<ConvertOrderKey> OrderClickCommand
        {
            get
            {
                return _orderClickCommand
                  ?? (_orderClickCommand = new RelayCommand<ConvertOrderKey>(
                    param =>
                    {
                        var temp = param;
                    }));
            }
        }

이렇게 구현하였다.

param에 모델데이터가 전부 넘어온다.


Posted by 동동(이재동)
c#2016.03.16 11:43


var isExist = _statsList.Where(c => c.ID == data.id).FirstOrDefault();


예전에는 요렇게 Where를 이용해서  isExist에 Null인지 아닌지 여부로 판단하였지만 


 var isExist =_statsList.Exists(c => c.ID == data.id);


요렇게 하는게 하면 bool 형으로 받아올수 있고 좀더 가독성도 좋기 때문에 앞으로 Exist를 많이 활용해야겠다.


Posted by 동동(이재동)
c#2015.01.15 13:49

 

요즘은 linq가 잘되있어서 삭제 하기 쉽지만

 

그렇지 못한 경우 예를 들면 scatterviewitem 이나 ui의 item들은

 

var data=new List<string>(){"One","Two","Three"};
for(int i=data.Count - 1; i > -1; i--)
{
    if(data[i]=="One")
    {
        data.RemoveAt(i);
    }
}

 

이런식으로 for를 역으로 돌려서 삭제 하면 된다.

 

http://stackoverflow.com/questions/7340757/c-sharp-list-removing-items-while-looping-iterating

Posted by 동동(이재동)
Windows Phone 82013.03.04 13:41

 

List 에 1,2,3 이 있으면 3,2,1 로 불러오고 싶을떄

 

List의 Reserve() 메소드를 이용한다.

 

하지만 옵저버블 컬렉션에서는 안되지만 방법이 있을듯하다.

 

 

 

참고 : http://msdn.microsoft.com/ko-kr/library/b0axc2h2(v=vs.85).aspx

Posted by 동동(이재동)
Windows Phone 72012.03.08 16:27

현재 Mnet을 작업하는데 Mnet에서 PlayList를 순서를 마음대로 바꿀수 있게 바꿔야 했다.

아이폰에서나 가능한 순서 바꾸기… 아무리 찾아봐도 순정 Listbox에는 할수 없다.

아이폰이나 안드로이드는 기본컨트롤에서 바꿀수 있는데 왜 윈폰은 없냐고!!!

하지만 누군가 만들어 놓은게 있어서 고맙게 이용해서 성공했다.

 

 

수정모드를 설정할수 있으며

수정모드에서 삭제버튼등을 추가할려면 아쉽게도 DataTemplate을 바꾼후 다시 리로딩해서 수정모드로 가야 한다.

바꾸는 방법은 포스팅했으니 참고 바란다.

자세한 사항은 소스를 참고하자

내가 참고한곳 : http://blogs.msdn.com/b/jasongin/archive/2011/01/03/wp7-reorderlistbox-improvements-rearrange-animations-and-more.aspx

내가 새로 만든 테스트 소스

Posted by 동동(이재동)
Windows Phone 72012.01.30 20:39

코레일을 하다가 index값을 구해야 하는 경우가 생겼다.

하지만 Linq에서 where 문을 이용해서 firstOrDefault()를 이용해서 값을 얻어 왔지만 그 값이 List의 몇번째 값인지는

알수 없었다. 다른데서는 지원되는데 윈폰7의 compact .net framework에서는 제공되지 않는것인가? ㅠㅠ

그래서 여러가지 방법중 좋은 방법을 찾았다.

그 방법은 바로..두구두구두구..

그냥 직접 제작하는것이다 하하하

일단 구현한 클래스는 이렇다.

using System;
using System.Collections.Generic;

namespace GloryApp.Utils
{
    public static class IEnumerableExtensions
    {
        public static int IndexWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
        {
            var enumerator = source.GetEnumerator();

            int index = 0;

            while (enumerator.MoveNext())
            {
                TSource obj = enumerator.Current;

                if (predicate(obj))

                    return index;

                index++;
            }

            return -1;
        }

        public static int IndexWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
        {
            var enumerator = source.GetEnumerator();

            int index = 0;

            while (enumerator.MoveNext())
            {
                TSource obj = enumerator.Current;

                if (predicate(obj, index))

                    return index;

                index++;
            }

            return -1;
        }
    }
}

 

그리고 위의 프레임워크를 사용할 클래스에 using 하면

var temp = siList.IndexWhere(c => c.h_srcar_no == currenSrcarNo);

이런식으로 얻어 올수 있다.

 

참고 : http://snipplr.com/view/53625/

Posted by 동동(이재동)