DataTable 값 대조에 대한 질문

DT1

A B
1 a
2 b
3 c
4 d
5 e

DT2

B C
a 11
c 22
e 55

DT1의 컬럼"B"의 값이 DT2의 컬럼"B" 에 존재하는 경우
boolB 에 True, False 여부를 넣고 해당하는 컬럼"C" 의 값을 strB에 넣고 싶습니다.
For Each를 사용하지 않고 해당 값을 출력할 수 있는 방법이 있을까요??

For each를 사용하지 않고 값을 넣어야 되는 이유가 뭘까요?
요청하신 질문은 For Each 성 반복문을 쓰지 않고서는 매우 비효율적인 코딩이 될 것 같습니다.

안녕하세요
①DT1,DT2데이터테이블 만드시고「Assign」액티비티에 밑에코드넣고 DT3만듬
②DT3에서「데이터테이블필터」액티비티로 C열만 추출
③ ②에서C열만추출한데이터테이블로 for each로 strB에 넣음

원하시는답이 맞는지는 잘모르겠는데 일단 적어봅니다.

(From d1 In DT1.AsEnumerable
Join d2 In DT2.AsEnumerable
On d1(“B”).ToString Equals d2(“B”).ToString
Select d2).CopyToDataTable

image

어떤걸 원하시는지 잘 몰라서 추정해볼 수 있는 두 가지 경우를 적어봅니다.
assign 내 코드가 길어서 주석에도 코드 내용을 썼습니다.

1. DT2내 특정 row만 input으로 받아서 boolB와 strB를 output으로 받환 받고 싶은 경우

  1. DT1의 컬럼B 값을 string배열화 시킨 다음 contains 메소드로 DT2의 특정 row의 B값을 비교하여 boolB로 받습니다.

  2. boolB가 True라면 strB에 DT2의 해당하는 row의 컬럼 C 값을 넣습니다.

  3. 상기 이미지의 경우 DT2의 row인덱스가 2일 경우의 boolB값과 strB 값을 가져온 내용이 우측 하단 출력 창에 보입니다.

2. 모든 row에 대해서 한번에 boolB와 strB 값을 받고 싶은 경우

  1. 결국 Join하는건 위에 분이 적어주신 접근방법과 유사합니다만, for each 안쓰고 boolB 연산을 하기 위해 우선 DT1, DT2를 left Join합니다. 굳이 Linq 안써도 액티비티가 있으니 저는 그걸로 Join했습니다.
    B의 유무를 판단해야 하므로 조인 조건은 DT1의 B = DT2의 B 로 설정합니다.
    조인 결과는 DT3으로 받아봅니다.

  2. True/False 값을 받을 데이터컬럼을 DT3에 추가합니다. 컬럼명은 위에 말씀하신 "boolB"라고 했습니다.

  3. boolB 컬럼의 Expression 값을 이미지와 같이 assign합니다. 컬럼 전체에 대한 값을 일괄로 입력하고 싶을 때 for each 대신 쓸 수 있습니다.
    Expression에서 뭘 할 수 있는지는 DataColumn.Expression Property (System.Data) | Microsoft Docs 참고 바랍니다.

  4. 기존의 컬럼 C 값을 결국 strB 값으로 쓸 것이므로 컬럼 C의 컬럼명을 strB로 바꿔줍니다. Join을 했기 때문에 따로 연산을 더 안해도 DT1에 해당 값이 있던 row만 이미 strB 값이 있습니다.
    결과적으로 만들어진 DT3 내용이 상기 이미지의 우측 하단 출력 창에 보이는 대로 만들어집니다.
    필요 없는 column이나 row는 filter 액티비티 등을 추가하셔서 원하시는 대로 제거하시면 됩니다.

완벽하게 원하시던 내용이 아니더라도 참고는 되셨길 바랍니다.