【问题标题】:Identifying distinct item in a C# list after spliting the value拆分值后识别 C# 列表中的不同项目
【发布时间】:2014-03-19 16:51:59
【问题描述】:

我正在使用 C# (.NET 4.0)。我有一个

class Employee
{
    public string Location { get; set; }
    public int ID { get; set; }
    public string FilterType { get; set; }

    public Employee(string name, int id, string fType)
    {
        Location = name;
        ID = id;
        FilterType = fType;
    }
}


List<Employee> empList = new List<Employee>();

Employee e = new Employee("[IND].[MH].&1", 1, "="); empList.Add(e);
e = new Employee("[SNG].[Tampines].&1", 7, "="); empList.Add(e);
e = new Employee("[IND].[MP].&2", 5, "="); empList.Add(e);
e = new Employee("[USA].[NYC].&2", 9, "="); empList.Add(e);
e = new Employee("[IND].[MH].&3", 3, "="); empList.Add(e);
e = new Employee("[IND].[MP].&1", 4, "="); empList.Add(e); 
e = new Employee("[SNG].[Bedok].&1", 6, "="); empList.Add(e);
e = new Employee("[USA].[NYC].&1", 8, "="); empList.Add(e);
e = new Employee("[IND].[MH].&2", 2, "="); empList.Add(e);

我想做什么:

  1. 用'.&'分割empList中的'name'属性
  2. 这将返回一个包含 2 个项目的数组。我将 array[0] 添加到字典中。
  3. 这将创建唯一项目列表(我们称之为唯一列表)
  4. 然后对于唯一列表中的每个项目,我将遍历 empList 中的每个项目,并像这样组合名称

如果唯一列表中的项目是 '[USA].[NYC]',则在遍历 empList 后,输出应为 {[USA].[NYC].&1, [USA].[NYC].&2 }。如果唯一列表中的项目是 '[SNG].[Tampines]',则 putput 应该是 '{[SNG].[Tampines].&1}'

我可以通过这样做来实现这一点

在 empList 上运行循环 - 用 '.&' 拆分名称并将结果添加到字典中以确保仅添加唯一项

然后在唯一列表上运行一个循环 - 在此循环内对 empList 运行另一个循环并检查 empList 中的当前项目是否包含 uniqueList 的项目并进行字符串操作。

我想知道是否有更聪明的方法来实现这一点。

谢谢

【问题讨论】:

  • 方式过于关注机制。描述你正在努力实现的目标会更有成效,因为无论那是什么,听起来绝对不是这样做的方法。首先,为什么Location 是一个哑字符串?
  • @Jon:感谢您的评论。我提供这么多细节的唯一原因是因为通常人们会问,你尝试过什么?为什么 loaction 是哑字符串 - 这是存储数据的多维数据集 (SSAS) 格式。我需要操作键来形成查询。
  • TL;DR:在更高的抽象级别描述您的目标。善意的荣誉,但“机制”和“细节”不是一回事。 “我想按所有者对小部件进行分组并找到拥有最多的所有者”是细节。 “我想拆分 .& 并将 [X].[Y] 转换为 {[X].[Y]&1....}”是机制。实际上,这听起来不像你想 split 本身。你想做别的事情并且你认为分裂是实现它的方法,但从这一点来看你可能是错的。见what is the XY problem?
  • @Jon:“XY 问题”是有道理的。收到消息:)

标签: c# list loops optimization .net-4.0


【解决方案1】:

是的,有一个更简单的方法。您可以按功能使用 LINQ 组:

    var grouped = from emp in empList
                  group emp by emp.Location.Split('&')[0] into g
                  select new {LocCode = g.Key, Emps = g};

    foreach (var group in grouped) {
        // group.LocCode contains, e.g., [USA].[NYC].,
        // group.Emps contains all employees at this location
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多