c# - 查找数组或 XML 中值的频率 (C#)

标签 c# xml linq linq-to-xml frequency

我有一个 XML 提要(我无法控制),我正在尝试找出如何检测文档中某些属性值的数量。

我还解析 XML 并将属性分离到数组中(用于其他功能)

这是我的 XML 示例

<items>
<item att1="ABC123" att2="uID" />
<item att1="ABC345" att2="uID" />
<item att1="ABC123" att2="uID" />
<item att1="ABC678" att2="uID" />
<item att1="ABC123" att2="uID" />
<item att1="XYZ123" att2="uID" />
<item att1="XYZ345" att2="uID" />
<item att1="XYZ678" att2="uID" />
</items>

我想根据每个 att1 值查找卷节点。 Att1 值将会改变。一旦我知道 att1 值的频率,我就需要提取该节点的 att2 值。

我需要找到前 4 个项目并提取它们的属性值。

所有这些都需要在后面的 C# 代码中完成。

如果我使用 Javascript,我将创建一个关联数组,并以 att1 为键,以频率为值。但由于我是 c# 新手,我不知道如何在 c# 中复制它。

所以我相信,首先我需要找到 XML 中所有唯一的 att1 值。我可以使用以下方法来做到这一点:

IEnumerable<string> uItems = uItemsArray.Distinct();
// Where uItemsArray is a collection of all the att1 values in an array

然后我陷入了如何将每个唯一的 att1 值与整个文档进行比较以获得存储在变量或数组或任何数据集中的卷的问题。

这是我最终使用的代码片段:

        XDocument doc = XDocument.Load(@"temp/salesData.xml");
        var topItems = from item in doc.Descendants("item")
                    select new
                    {
                        name = (string)item.Attribute("name"),
                        sku = (string)item.Attribute("sku"),
                        iCat = (string)item.Attribute("iCat"),
                        sTime = (string)item.Attribute("sTime"),
                        price = (string)item.Attribute("price"),
                        desc = (string)item.Attribute("desc")

                    } into node
                    group node by node.sku into grp
                    select new { 
                        sku = grp.Key,
                        name = grp.ElementAt(0).name,
                        iCat = grp.ElementAt(0).iCat,
                        sTime = grp.ElementAt(0).sTime,
                        price = grp.ElementAt(0).price,
                        desc = grp.ElementAt(0).desc,
                        Count = grp.Count() 
                    };

        _topSellers = new SalesDataObject[4];
        int topSellerIndex = 0;
        foreach (var item in topItems.OrderByDescending(x => x.Count).Take(4))
        {
            SalesDataObject topSeller = new SalesDataObject();
            topSeller.iCat = item.iCat;
            topSeller.iName = item.name;
            topSeller.iSku = item.sku;
            topSeller.sTime = Convert.ToDateTime(item.sTime);
            topSeller.iDesc = item.desc;
            topSeller.iPrice = item.price;
            _topSellers.SetValue(topSeller, topSellerIndex);
            topSellerIndex++;
        } 

感谢您的帮助!

最佳答案

您使用的是.NET 3.5吗? (它看起来像是基于您的代码。)如果是这样,我怀疑使用 LINQ to XML 和 LINQ to Objects 这很容易。然而,恐怕从你的例子中并不清楚你想要什么。所有具有相同 att1 的值是否也具有相同的 att2?如果是这样,则类似于:

var results = (from element in items.Elements("item")
              group element by element.Attribute("att1").Value into grouped
              order by grouped.Count() descending
              select grouped.First().Attribute("att2").Value).Take(4);

我还没有测试过它,但我认为它应该可以工作......

  • 我们从所有 item 元素开始
  • 我们按 att1 值对它们进行分组(仍然作为元素)
  • 我们按大小对组进行降序排序,最大的排在前面
  • 从每个组中,我们取出第一个元素来查找其 att2 值
  • 我们选出了这些结果中的前四名

关于c# - 查找数组或 XML 中值的频率 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/375940/

相关文章:

c# - Linq大量更新时极慢

java - android.R 的 Android 开发问题

android - 从父级的样式定义中获取子级的样式属性

c# - 用于检查字符串数组中唯一性的哈希码

c# - 如何在 EF Core 中使用 LINQ 将原始数据类型列表与实体连接起来?

c# - 我正在尝试为白天/夜晚的配色方案设计一个解决方案,但卡住了

c# - 如何捕捉 CancellationToken.ThrowIfCancellationRequested

javascript - 如何将标签添加到Asp.net文本框?

javascript - 使用JS/Jquery解析远程Xml文件?

c# - 如何将多个 linq 查询组合成一个结果集?