我正在為市場創建一個軟體,并希望創建一個串列視圖來計算列內的所有重復值。
此計數將顯示買家經常購買的商品數量。
這是ListView應該的概念。它從ListView1的列開始計數,并把重復的,計數,并顯示ListView2里面的資料。

我需要知道:
- 如何計算“Purchased Items”列中的所有重復值。
- 并在另一個 ListView 中顯示計數結果,其中包含值本身。
注意:在這種情況下,“名稱”中的值是一個專案,“購買的專案”是一個子專案。這些資料來自簡單地輸入文本框并單擊按鈕。
uj5u.com熱心網友回復:
因此,如果我了解您想要另一個包含重復項和計數的串列視圖?
如果是這樣,您可以創建一個 List<> 然后將該專案添加到串列中,在這種情況下,我相信這將是一個字串,也許是這樣的?這只是一個用于演示的控制臺應用程式。
List<string> myList = new List<string>();
myList.Add("One");
myList.Add("Two");
myList.Add("Three");
myList.Add("One");
myList.Add("Two");
myList.Add("Four");
List<string> noDupes = myList.Distinct().ToList();
foreach(string dupe in noDupes)
{
Console.WriteLine(dupe);
}
Console.WriteLine(noDupes.Count());
uj5u.com熱心網友回復:
給定下一個串列:
List<myClass> items = new List<myClass>()
{
new myClass() { Name = "John Doe", Item = "Shoes" },
new myClass() { Name = "John Doe", Item = "T-Shirt" },
new myClass() { Name = "John Doe", Item = "Jeans" },
new myClass() { Name = "Rick Astley", Item = "Baseball bat" },
new myClass() { Name = "Rick Astley", Item = "Sandwich" },
new myClass() { Name = "Rick Astley", Item = "T-Shirt" },
new myClass() { Name = "Rick Astley", Item = "Shoes" },
new myClass() { Name = "Jane Doe", Item = "Shoes" },
new myClass() { Name = "Jane Doe", Item = "T-Shirt" },
new myClass() { Name = "Joe Mm.", Item = "Shoes" },
new myClass() { Name = "Joe Mm.", Item = "Milk" },
};
你可以這樣分組和計數:
var l = items.GroupBy(group => group.Item)
.Select(n => new { Item = n.Key, Count = n.Count() })
.ToList();
結果:
Item: Shoes Count: 4
Item: T-Shirt Count: 3
Item: Jeans Count: 1
Item: Baseball bat Count: 1
Item: Sandwich Count: 1
Item: Milk Count: 1
uj5u.com熱心網友回復:
您可以使用System.Linq.GroupBy邏輯和DataGridView視圖的(Winforms 示例)來實作您想要的結果:

撰寫的代碼量很小!只需將 Data Binding Winforms、Xamarin、WPF用于兩個串列:
首先創建兩個包含您希望顯示的屬性的類:
internal class UserPurchase
{
public string Name { get; internal set; } // Internal makes item ReadOnly in view
public string Purchase { get; internal set; }
}
和
internal class PurchasedItem
{
public string Description { get; internal set; }
public int Count { get; internal set; }
}
然后宣告兩個BindingList(Winforms 示例)或ObservableCollection(其他)。
internal BindingList<UserPurchase> PurchasesByUser { get; } = new BindingList<UserPurchase>();
internal BindingList<PurchasedItem> PurchasedByItem { get; } = new BindingList<PurchasedItem>();
這顯示了如何在 Winforms 中附加系結(對于其他平臺,請使用 xaml)。因此DataGridView,現在將使用這兩個類的屬性自動生成列。
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
if (!DesignMode)
{
// Bind the lists to the UI element to display them.
dataGridView1.DataSource = PurchasesByUser;
dataGridView2.DataSource = PurchasedByItem;
initList1();
}
}
這是填充List1 PurchasesByUser然后應用于System.Linq.GroupBy計算List1PurchasedByItemList2 的串列初始化程式:
private void initList1()
{
XElement xsource = XElement.Parse(source);
XElement[] xusers = xsource.Elements("user").ToArray();
foreach (XElement xuser in xusers)
{
XElement[] xpurchases = xuser.Element("items").Elements("item").ToArray();
foreach (XElement xpurchase in xpurchases)
{
var xname = xuser.Element("name");
// Every time you add a record to the list, it appears in the View automatically.
PurchasesByUser.Add(new UserPurchase { Name = (string)xname, Purchase = (string)xpurchase });
}
}
// Make what is essentially a list *of* lists using System.Linq.GroupBy
var groups =
PurchasesByUser.GroupBy(purchase => purchase.Purchase);
foreach (var group in groups)
{
// Decoding the Group:
Debug.WriteLine(
$"The group '{group.Key}' holds {group.Count()} items");
Debug.WriteLine(
$"The customers are { string.Join(",", group.ToList().Select(item=>item.Name))}");
var byItem = new PurchasedItem { Description = group.Key, Count = group.Count() };
PurchasedByItem.Add(byItem);
}
}
最后為您的資料庫建模(帶有子項),我使用了 Xml 格式的這個字串:
const string source =
@"<purchases>
<user>
<name>John Doe</name>
<items>
<item>Shoes</item>
<item>T-Shirts</item>
<item>Jeans</item>
</items>
</user>
<user>
<name>Rick Astley</name>
<items>
<item>Baseball bat</item>
<item>Sandwich</item>
<item>T-Shirts</item>
<item>Shoes</item>
</items>
</user>
<user>
<name>Jane Doe</name>
<items>
<item>Shoes</item>
<item>T-Shirts</item>
</items>
</user>
<user>
<name>Anonymous</name>
<items>
<item>Laptop</item>
</items>
</user>
<user>
<name>Joe Mm.</name>
<items>
<item>Milk</item>
<item>Shoes</item>
</items>
</user>
</purchases>";
這當然只是一種方法,但您的問題是展示結合System.Linq System.Xml.Linq資料系結和資料系結的概念的好方法。如果您想嘗試一下,我在GitHub 上發布了我的代碼。
uj5u.com熱心網友回復:
按第二個(索引 = 1)ListView的值對輸入的專案進行分組以獲得,然后使用元素(型別為)屬性和方法來創建輸出的物件。ColumnHeaderIEnumerable<IGrouping<string, ListViewItem>>IGrouping<string, ListViewItem>KeyCountListViewItemListView
這是一個襯里:
listView2.Items.AddRange(listView1.Items
.Cast<ListViewItem>()
.GroupBy(x => x.SubItems[1].Text, StringComparer.OrdinalIgnoreCase)
.Select(x => new ListViewItem(new[] { x.Key, x.Count().ToString() }))
.ToArray());
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/482000.html
