簡體   English   中英

按清單內容分組項目

[英]Group items by content of list

可以說我得到了這樣的東西:

public class Subscriber{
    public string Name {get; set;}  
}

public class SomeData{
    public string Content {get; set;}   
}

public class InputData {
    public Subscriber Subscribers { get; set; }
    public IEnumerable<SomeData> DataItems { get; set; }
}

public class QueueItem {
    public IEnumerable<Subscriber> Subscribers { get; set; }
    public IEnumerable<SomeData> DataItems { get; set; }
}

現在說我得到一個充滿“ Subscribers”的List<InputData> ,其中包含每個訂戶的數據列表。

現在,我想比較每個訂閱者的數據列表,並以List<QueueItem> ,如果2個訂閱者具有相同的數據項集,則它們將為1 QueueItem

希望這有意義

該技術正在將EqualityComparer與Enumerable.SequenceEqual()結合使用

public class Subscriber
{
    public string Name { get; set; }

    // For compare
    public override bool Equals(object obj) { return string.Equals(this.Name, ((Subscriber)obj).Name); }
    public override int GetHashCode() { return this.Name.GetHashCode(); } 
}

public class SomeData
{
    public string Content { get; set; }

    // For compare
    public override bool Equals(object obj) { return string.Equals(this.Content, ((SomeData)obj).Content); }
    public override int GetHashCode() { return this.Content.GetHashCode(); } 
}

public class InputData
{
    public Subscriber Subscribers { get; set; }
    public IEnumerable<SomeData> DataItems { get; set; }

    // Should always initialize an empty collection
    public InputData() { this.DataItems = new List<SomeData>(); }
}

public class QueueItem
{
    public IEnumerable<Subscriber> Subscribers { get; set; }
    public IEnumerable<SomeData> DataItems { get; set; }

    // Should always initialize an empty collection
    public QueueItem() { this.Subscribers = new List<Subscriber>(); this.DataItems = new List<SomeData>(); }
}

public class DataItemsEqualityComparer : EqualityComparer<IEnumerable<SomeData>>
{

    public override bool Equals(IEnumerable<SomeData> x, IEnumerable<SomeData> y)
    {
        return Enumerable.SequenceEqual(x.OrderBy(i => i.Content), y.OrderBy(i => i.Content));
    }

    public override int GetHashCode(IEnumerable<SomeData> obj)
    {
        return obj.Select(i => i.GetHashCode()).Sum().GetHashCode();
    }
}

用法

var data = new List<InputData>();
var fruits = new[] { new SomeData() { Content = "apple" }, new SomeData() { Content = "pear"} };
var colors = new[] { new SomeData() { Content = "red" }, new SomeData() { Content = "blue" }, new SomeData() { Content = "green" } };

data.Add(new InputData() { Subscribers = new Subscriber() { Name = "Alice" }, DataItems = new List<SomeData>(fruits) });
data.Add(new InputData() { Subscribers = new Subscriber() { Name = "Bob" }, DataItems = new List<SomeData>(colors) });
data.Add(new InputData() { Subscribers = new Subscriber() { Name = "Charlie" }, DataItems = new List<SomeData>(fruits) });

List<QueueItem> groupedData = data.GroupBy(
    i => i.DataItems, 
    i => i.Subscribers, 
    new DataItemsEqualityComparer())
    .Select(i => new QueueItem() { Subscribers = i, DataItems = i.Key }).ToList();

結果

QueueItem :
  Subscribers:
  - Alice
  - Charlie
  Data:
  - apple
  - pear
QueueItem :
  Subscribers:
  - Bob
  Data:
  - red
  - blue
  - green

 var queue = Dictionary(Subscriber, List<SomeData>); //And lets just for example add some data var items1 = new List<SomeData>(); items1.Add(new SomeData("test")); items1.Add(new SomeData("test2")); var items2 = new List<SomeData>(); items2.Add(new SomeData("test")); queue.Add(new Subscriber("Peter"), items1); queue.Add(new Subscriber("Luke"), items1); queue.Add(new Subscriber("Anna"), items2); Dictionary<Subscriber, List<SomeData>> myDictionary = queue .GroupBy(o => o.PropertyName) .ToDictionary(g => g.Key, g => g.ToList()); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM