请参阅下面的代码.
static void Main(string[] args)
{
// Create Dictionary
var dict = new Dictionary<TestClass, ValueClass>();
// Add data to dictionary
CreateSomeData(dict);
// Create a List
var list = new List<TestClass>();
foreach(var kv in dict) {
// Swap property values for each Key
// For example Key with property value 1 will become 6
// and 6 will become 1
kv.Key.MyProperty = 6 - kv.Key.MyProperty + 1;
// Add the Key to the List
list.Add(kv.Key);
}
// Try to print dictionary …Run Code Online (Sandbox Code Playgroud) 背景
在 PowerShell 中构建哈希表以通过特定属性快速访问对象是很常见的,例如基于以下内容建立索引LastName:
$List = ConvertFrom-Csv @'
Id, LastName, FirstName, Country
1, Aerts, Ronald, Belgium
2, Berg, Ashly, Germany
3, Cook, James, England
4, Duval, Frank, France
5, Lyberg, Ash, England
6, Fischer, Adam, Germany
'@
$Index = @{}
$List |ForEach-Object { $Index[$_.LastName] = $_ }
$Index.Cook
Id LastName FirstName Country
-- -------- --------- -------
3 Cook James England
Run Code Online (Sandbox Code Playgroud)
在某些情况下,需要在两个(甚至更多)属性上构建索引,例如 theFirstName和 the LastName。为此,您可以创建一个多维密钥,例如:
$Index = @{}
$List |ForEach-Object {
$Index[$_.FirstName] = @{} …Run Code Online (Sandbox Code Playgroud) 我有一个List,它根据一些XML元素的Linq查询每分钟更新一次.
xml会不时发生变化.有人建议我可以使用Hashcode来确定列表中的任何字符串是否已更改.
我已经看到了一些Md5哈希码计算的例子只是一个字符串,但不是列表...有人能告诉我一个用列表做这个的方法吗?
我试过像int test = list1.GetHashCode这样简单的东西; 但无论列表中的内容如何,代码都是相同的......
这是带有链接查询的整个方法,最后是所有..note SequenceEqual:
private void GetTrackInfo()
{
_currentTitles1.Clear();
var savedxmltracks = new XDocument();
listBox1.Items.Clear();
WebClient webClient = new WebClient();
XmlDocument xmltracks = new XmlDataDocument();
try
{
xmltracks.Load(_NPUrl);
xmltracks.Save("xmltracks.xml");
}
catch (WebException ex)
{
StatusLabel1.Text = ex.Message;
}
try
{
savedxmltracks = XDocument.Load("xmltracks.xml");
}
catch (Exception ex)
{
StatusLabel1.Text = ex.Message;
}
var dateQuery = from c in savedxmltracks.Descendants("content")
select c;
_count = savedxmltracks.Element("content").Element("collection").Attribute("count").Value;
var tracksQuery1 = from c in savedxmltracks.Descendants("data")
select new
{ …Run Code Online (Sandbox Code Playgroud) 只是想知道我在标题中提到的是一个好习惯.这对我来说很有意义,我们重写GetHashCode以返回一个基于两个属性的值,如果匹配,则应将两个对象视为相等.逻辑似乎很好,代码可以工作,但我不知道它是否会导致其他问题.
这是使用GetHashCode:
public static bool operator ==(CartesianCoordinates a, CartesianCoordinates b)
{
return a.GetHashCode() == b.GetHashCode(); // Using GetHashCode here
}
public static bool operator !=(CartesianCoordinates a, CartesianCoordinates b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
return this == (CartesianCoordinates)obj; // This just uses the == override
}
public override int GetHashCode()
{
return (this.X + this.Y.ToLower()).GetHashCode(); // GetHashCode hashes the two properties we care about
}
Run Code Online (Sandbox Code Playgroud)
这就是我以前的方式:
public static bool operator ==(CartesianCoordinates a, CartesianCoordinates b) …Run Code Online (Sandbox Code Playgroud) 我有一个字典,它接受一个元组函数和一个int
Dictionary<Tuple<string,string>, int> fullNames = new Dictionary<Tuple<string,string>, int>();
Run Code Online (Sandbox Code Playgroud)
将Tuple类定义为
public class Tuple<T, T2>
{
public Tuple(T first, T2 second)
{
First = first;
Second = second;
}
public T First { get; set; }
public T2 Second { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想这样使用Containskey函数
if (fullNames.ContainsKey(Tuple<"firstname","lastname">))
Run Code Online (Sandbox Code Playgroud)
但我收到过载错误.有什么建议?
历史原因很长,但问题很简单。有 3 个字符串,我需要缓存匹配值。为了获得快速缓存,我使用以下代码:
public int keygen(string a, string b, string c)
{
var x = a + "@@" + b + "@@" + c;
var hash = x.GetHashCode();
return hash;
}
Run Code Online (Sandbox Code Playgroud)
(请注意,字符串a, b,c不包含代码"@@")它本身的缓存只是一个Dictionary<int, object>
我知道存在散列键可能不唯一的风险,但除此之外:
有谁知道制作 int 键的更快方法吗?(在 C# 中)此操作大约占用总 CPU 时间的 15%,并且这是一个长时间运行的应用程序。
我尝试了几种实现,但未能找到更快的实现。
我想检查具有给定值的Object是否存在,SortedSet<>但我不明白自定义比较在这里是如何工作的.在List<>.Exists()我可以只使用lambda,但我不能那样做,我没有得到整个界面的东西,而msdn说我需要覆盖int返回功能.
public class Node
{
public int X, Y;
public int rand;
public Node(int x, int y, int r)
{ X = x; Y = y; rand = r; }
}
class Program
{
static void Main(string[] args)
{
SortedSet<Node> mySet = new SortedSet<Node>();
mySet.Add(new Node(1, 2, 90));
Node myNode = new Node(1, 2, 50);
// I want this to check if X and Y are the same
if (mySet.Contains(myNode, interfaceThing))
Console.WriteLine("Sth is already …Run Code Online (Sandbox Code Playgroud) 随着收藏的Rules我试图创建的另一个集合Rules忽略了Site财产,创造一个独特的名单.
public class Rule
{
public int TestId { get; set; }
public string File { get; set; }
public string Site { get; set; }
public string[] Columns { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我的收藏品具有如下值:
var rules = new List<Rule>
{
new Rule { TestId = 1, File = "Foo", Site = "SiteA", Columns = new string[] { "ColA", "ColB" }},
new Rule { TestId = 1, File = "Foo", Site = "SiteB", Columns …Run Code Online (Sandbox Code Playgroud) 场景:
我有对象的名单" Order并想通过组相同的List<OrderLine>属性,用相同的我的意思是在同一个订单行的数量相同,以及相同的SKU/Quantity值",并返回分组顺序值的列表:
class Order
{
public int OrderNumber { get; set; }
public List<OrderLine> Lines { get; set; }
}
class OrderLine
{
public string Sku { get; set; }
public int Quantity { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
输入样本:
+-------------+-----+----------+
| OrderNumber | Sku | Quantity |
+-------------+-----+----------+
| 1 | A | 10 |
| 1 | B | 20 |
| 2 | A | 10 |
| 3 | A | 10 | …Run Code Online (Sandbox Code Playgroud) 我有一个类Person,我必须覆盖它的Equals和GetHashCode方法.如果名称匹配,则两个人对象等于电子邮件匹配.使用相当高效的哈希函数,这样做的好方法是什么?
class Person
{
string Name
string Email
public override Equals(object obj)
{
if (ReferenceEquals(obj, null))
return false;
if (ReferenceEquals(this, obj))
return true;
if (obj is Person)
{
Person person = (Person)obj;
return
(this.Name == person.Name)
|| (this.Email == person.Email);
}
return false;
}
public override GetHashCode()
{
// What's a good way to implement?
}
}
Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×2
dictionary ×2
linq ×2
class ×1
equals ×1
generic-list ×1
gethashcode ×1
hash ×1
hashcode ×1
hashtable ×1
indexing ×1
md5 ×1
performance ×1
powershell ×1
sortedset ×1