這是爲了做到這一點:
itemContainer.items = list1.Concat(list2).Concat(list3)
.Distinct()
.OrderBy(item => item.Name)
.ThenByDescending(item => item.IsSelected)
.ToList();
這裏是你問什麼是完整的例子,
不要注意到你不需要GroupBy
,因爲分組的返回值與您希望收到的新列表不相同。
你需要重寫Item
方法GetHashCode()
和Equals(object obj)
爲Distinct()
會自動使用這些項目之間的比較。
class Program
{
static void Main(string[] args)
{
var list1 = new List<Item>
{
new Item {Name = "A", IsSelected = true},
new Item {Name = "B", IsSelected = false},
new Item {Name = "C", IsSelected = true}
};
var list2 = new List<Item>
{
new Item {Name = "A", IsSelected = true},
new Item {Name = "C", IsSelected = true},
new Item {Name = "D", IsSelected = false}
};
var list3 = new List<Item>
{
new Item {Name = "B", IsSelected = true},
new Item {Name = "E", IsSelected = false},
new Item {Name = "F", IsSelected = false}
};
var itemContainer = new ItemContainer();
itemContainer.items = list1.Concat(list2).Concat(list3)
.Distinct()
.OrderBy(item => item.Name)
.ThenByDescending(item => item.IsSelected)
.ToList();
//new list of items will contain 7 items:
// A,true
// B,true
// B,false
// C,true
// D,false
// E,false
// F,false
}
}
public class Item
{
public string Name;
public bool IsSelected;
public override int GetHashCode()
{
return Name.GetHashCode() * IsSelected.GetHashCode();
}
public override bool Equals(object obj)
{
var objItem = obj as Item;
return objItem != null && objItem.Name == Name && objItem.IsSelected == IsSelected;
}
}
public class ItemContainer
{
public string Name;
public IList<Item> items; //items with the same 'Name' (potentially)
}
'ItemContainer'有一個'Name'屬性嗎? –
是的,你是對的。我更新了我的代碼。 – alhazen
你嘗試過什麼嗎?用LINQ做這件事非常簡單,但即使是一個foreach循環也會這樣做...... – MarcinJuraszek