iT邦幫忙

0

C# 合併兩個集合列表

c#
Ks 2019-02-21 10:23:152512 瀏覽
  • 分享至 

  • xImage

請教各位大大,
請問有什麼辦法寫法可以合併這兩個List item,
不用foreach或者for,
並且如果有重複的name並且不為0 就更新他的amount。

List<Wallet> list_A = new List<Wallet>(){
    new Wallet(){ name = "A" , amount = 0},
    new Wallet(){ name = "B" , amount = 0},
    new Wallet(){ name = "C" , amount = 0}
};

List<Wallet> list_B = new List<Wallet>(){
    new Wallet(){ name = "A" , amount = 10}
};

public class Wallet 
{
    public string name { get; set; }
    public decimal amount { get; set; }
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

4
暐翰
iT邦大師 1 級 ‧ 2019-02-21 10:35:27
最佳解答

邏輯
1.因為是兩個集合綜合比較,所以使用union

2.並且如果有重複的name並且不為0 就更新他的amount。

假如list_A amount 是 20,list_B amount是10情況下該如何選擇呢?
所以我這邊取其最大值為準,所以使用group by name + max(amount)

Code

void Main()
{
	List<Wallet> list_A = new List<Wallet>(){
		new Wallet(){ name = "A" , amount = 0},
		new Wallet(){ name = "B" , amount = 0},
		new Wallet(){ name = "C" , amount = 0}
	};

	List<Wallet> list_B = new List<Wallet>(){
		new Wallet(){ name = "A" , amount = 10}
	};

	var result = list_A.Union(list_B).GroupBy(g => g.name).Select(s => new Wallet() {name=s.Key,amount=s.Max(m=>m.amount)}).ToList();
}

public class Wallet
{
	public string name { get; set; }
	public decimal amount { get; set; }
}

結果:

name	amount
A	10
B	0
C	0
看更多先前的回應...收起先前的回應...
Ks iT邦新手 3 級 ‧ 2019-02-21 10:44:09 檢舉

感謝大大的解答,因為我的list_A的amount固定為0,這個辦法可以
非常感謝~
/images/emoticon/emoticon02.gif

暐翰 iT邦大師 1 級 ‧ 2019-02-21 11:05:32 檢舉

/images/emoticon/emoticon12.gif

Ks iT邦新手 3 級 ‧ 2019-02-22 15:48:01 檢舉

抱歉,再請問一下,
如果有一個bool的欄位IsActive,要怎麼寫呢?
我想要的結果是,如果其中一個為True的話就return為True

因為list_B 確定為都是false
我目前是這樣寫IsActive = s.Select(e => e.IsActive).FirstOrDefault()
直接獲取第一個A的value,但是貌似不是很好的辦法

米歐 iT邦新手 3 級 ‧ 2019-02-22 17:40:17 檢舉

可以改成這樣IsActive = s.Any(e => e.IsActive)

我要發表回答

立即登入回答